找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 76027|回复: 18

[文件操作] [已解决]存在多个U盘(移动磁盘)时如何查找(搜索)并运行里面指定的程序?

[复制链接]
发表于 2016-3-15 22:35:28 | 显示全部楼层 |阅读模式
本帖最后由 vszy 于 2016-3-20 17:07 编辑

脚本目的:电脑上有两个物理U盘,先获取这些U盘的路径(即盘符),然后再获取的盘符里查找指定程序并运行(如果没有就退出脚本,如果两个U盘里有同样的EXE文件,执行最后盘符那个)
首先关于定位U盘搜索了论坛,发现下面的帖子:
http://www.bathome.net/viewthrea ... p;highlight=U%C5%CC
里面的方案一和二只能获取到我的最后一个U盘(L:),方案三却只能获得前面那个(G:),不知道是哪里出了问题。
于是又找了度娘,得到以下命令可以获得两个盘符:

  1. @echo off&title 查看可移动盘个数及盘符
  2. for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do fsutil fsinfo drivetype %%i:| find "可移动"
  3. pause
复制代码
接下来开始研究在获取的U盘路径里搜索并运行,查到以下命令:

  1. for %%a in (C D E F G H I J K L M O P Q R S T U V W X Y Z) do (
  2. if exist %%~a:\ for /f "delims=" %%b in ('dir /a-d/s/b "%%~a:\QQ.exe"') do start "" "%%~b"
  3. )
复制代码
但这个是全盘搜索,很费时间。不知道怎么改成只搜索获取到的那两个U盘,还有就是如果存在同名文件怎么指定运行最后盘符那个?

个人能力实在有限了,望有经验的朋友帮助一下,谢谢!

刚刚又有个想法,已知条件:在U盘下有个test.ini文件(U盘盘符和test.ini所在目录不确定),test.ini内容如下:

  1. [Common]
  2. NAME1=1.EXE
  3. NAME2=2.EXE
  4. NAME3=3.EXE
复制代码
这里的NAME1,NAME2,NAME3也是已知的。

能不能写个BAT,要求先找到这个INI文件的路径并读取NAME1或2或3的值。最后运行“INI路径\1或2或3.EXE”
例如:比如INI在G:\soft下,读取NAME2段,最终结果是start G:\soft\2.exe
发表于 2016-3-16 06:39:08 | 显示全部楼层
本帖最后由 ygqiang 于 2016-3-16 06:44 编辑

回复 1# vszy
  1. echo 可移动盘:
  2. for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  3. fsutil fsinfo drivetype %%a: | find "可移动">nul && (echo %%a) && (

  4. if exist %%a:\ for /f "delims=" %%b in ('dir /a-d/s/b "%%a:\QQ.txt"') do start "" "%%b"

  5. )
  6. )
复制代码
如果同时存在。就将C D E F...Z,修改成:Z X Y ... F E D C
发表于 2016-3-16 11:16:51 | 显示全部楼层
从最后一个U盘盘符倒数开始找,如果找到了,执行test.ini中对应NAME2的程序,然后退出,不会继续找其他U盘,
如果当前U盘符找不到,找其他U盘盘符
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "skip=1" %%a in ('wmic LogicalDisk where "DriveType='2'" get DeviceID') do (
  4.   set /a n+=1
  5.   set d!n!=%%a
  6. )
  7. set /a m=n-1
  8. for /l %%a in (%m%,-1,1) do (
  9.   for /f "delims=" %%b in ('dir /a-d /s /b !d%%a!\test.ini') do (
  10.     if exist "%%b" (
  11.       for /f "tokens=1-2 delims==" %%c in (%%b) do (
  12.         if "%%c"=="NAME2" start "%%~dpb%%d"
  13.       )
  14.       goto :eof
  15.     )
  16.   )
  17. )
复制代码
 楼主| 发表于 2016-3-16 18:16:50 | 显示全部楼层
回复 3# flyinnet9


    先谢谢这位兄弟了,但实测无效,而且死机了。
 楼主| 发表于 2016-3-16 19:32:10 | 显示全部楼层
请版主封贴吧,想换个思路解决问题。谢谢
 楼主| 发表于 2016-3-16 19:42:07 | 显示全部楼层

全盘搜索INI并读取其里面的值后执行一定的操作。

本帖最后由 vszy 于 2016-3-16 19:51 编辑

已知条件:有个test.ini文件(test.ini所在目录不确定,需全盘搜索),test.ini内容如下:

  1. [Common]
  2. NAME1=1.EXE
  3. NAME2=2.EXE
  4. NAME3=3.EXE
复制代码
这里的NAME1,NAME2,NAME3也是已知的。

能不能写个BAT,要求先找到这个INI文件的路径并读取NAME1或2或3的值。最后运行“INI路径\1或2或3.EXE”
例如:比如test.ini在G:\soft下,读取NAME2段,最终结果是start G:\soft\2.exe

昨晚找了一些资料,也整合了以下代码:

  1. @echo off
  2. rem 指定待搜索的文件
  3. set "FileName=test.ini"
  4. echo 正在搜索,请稍候...
  5. for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  6.     if exist %%a:\ (
  7.         pushd %%a:\
  8.         for /r %%b in (*%FileName%) do (
  9.             if /i "%%~nxb" equ "%FileName%" (
  10.                 echo,%%b
  11.             )
  12.         )
  13.         popd
  14.     )
  15. )
  16. pause
复制代码

  1. @Echo OffFor /f "tokens=1-2 delims==" %%i in (test.ini) do (If /i "%%i"=="NAME1" Echo.%%j)Pause
复制代码
echo却得到G:\soft\test.ini2.exe这样的结果  而不是G:\soft\2.exe   ,今天又改了下还是无果,特来请教各位朋友。

评分

参与人数 1PB -4 收起 理由
pcl_test -4 未按版规发帖

查看全部评分

发表于 2016-3-16 20:31:39 | 显示全部楼层
本帖最后由 /zhqsystem/zhq 于 2016-3-16 20:32 编辑

回复 6# vszy
  1. for /f "delims=" %%i in ('wmic logicaldisk get caption /value^|find/i "caption="')do (set "%%i"
  2. for /f "delims=" %%j in ('dir/a-d/s/b/l/on "!caption!\*.ini"')do if /i "%%~nxj"=="test.ini" (
  3.   for /f "takens=1,* delims==" %%k in ('type "%%j"')do (set "name=%%k"
  4.    for /l %%n in (1,1,1000)do (
  5.     if /i "name%%n"=="!name!" (
  6.      echo,"%%~dpj%%~nxl"
  7.     )
  8.    )
  9.   )
  10. )
  11. )
复制代码
 楼主| 发表于 2016-3-16 20:40:13 | 显示全部楼层
回复 7# /zhqsystem/zhq

不知道你这个是不是完整代码,运行就是这个结果。
 楼主| 发表于 2016-3-16 23:01:04 | 显示全部楼层

  1. @echo off
  2. rem 指定待搜索的文件
  3. set "FileName=vszy.ini"
  4. echo 正在搜索,请稍候...
  5. for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  6.     if exist %%a:\ (
  7.         pushd %%a:\
  8.         for /r %%b in (*%FileName%) do (
  9.             if /i "%%~nxb" equ "%FileName%" (
  10. For /f "tokens=1-2 delims==" %%i in (%%b) do (If /i "%%i"=="NAME" Echo.%%b%%j)
  11.              )
  12.          )
  13.      )
  14. )
  15. pause
复制代码
这是自己研究的半成品,结果如下:

怎么才能去掉红框里的部分啊?
还有就是如果找不到INI文件就往下执行别的或退出该怎么加入?
发表于 2016-3-16 23:30:44 | 显示全部楼层
回复 9# vszy


    Echo.%%~dpb%%j
发表于 2016-3-17 04:12:24 | 显示全部楼层
回复 8# vszy
变量延迟,看你自己都会编写简单的了,怎么就看不到!!!!!!!变量延迟符号呢,无语
发表于 2016-3-17 06:44:24 | 显示全部楼层
回复 9# vszy


    @echo off&setlocal enableDelayedExpansion

代码开头加上这个。。
发表于 2016-3-17 09:54:26 | 显示全部楼层
回复 4# vszy


    实测并没有死机,start少了"",把有start那一行改成:
  1. if "%%c"=="NAME2" start "" "%%~dpb%%d"
复制代码
另外看起来使用wmic的2个脚本都有类似死机的症状,你可以在命令行运行wmic LogicalDisk where "DriveType='3'" get DeviceID看看结果
如果确实是wmic的问题,那就用枚举驱动器的方法代替wmic部分也行也行
 楼主| 发表于 2016-3-17 11:29:37 | 显示全部楼层
本帖最后由 vszy 于 2016-3-17 14:16 编辑

回复 10# CrLf

先谢谢老大了,想再问问如果INI文件内容如下:

  1. [Common]
  2. ITEM1=QQ.EXE
  3. ITEM2=RAR.EXE
  4. ITEM3=PS.EXE
  5. ..............
复制代码
让批处理检测到INI并获取后先运行QQ.EXE等待完成,再运行RAR.EXE.......,如果没检测到INI就执行别的或退出
这样要怎么写?
 楼主| 发表于 2016-3-17 11:32:17 | 显示全部楼层
本帖最后由 vszy 于 2016-3-17 14:29 编辑

回复 13# flyinnet9

谢谢朋友了,的确加了两个冒号问题解决了。还想追问下(不好意思了)
如果INI文件内容如下:

  1. [Common]
  2. ITEM1=QQ.EXE
  3. ITEM2=RAR.EXE
  4. ITEM3=PS.EXE
  5. ..............
复制代码
让批处理检测到INI并获取后先运行QQ.EXE等待完成,再运行RAR.EXE.......
这样要怎么改写?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 23:54 , Processed in 0.022867 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表