Board logo

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

作者: vszy    时间: 2016-3-15 22:35     标题: [已解决]存在多个U盘(移动磁盘)时如何查找(搜索)并运行里面指定的程序?

本帖最后由 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
作者: ygqiang    时间: 2016-3-16 06:39

本帖最后由 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
作者: flyinnet9    时间: 2016-3-16 11:16

从最后一个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. )
复制代码

作者: vszy    时间: 2016-3-16 18:16

回复 3# flyinnet9


    先谢谢这位兄弟了,但实测无效,而且死机了。
作者: vszy    时间: 2016-3-16 19:32

请版主封贴吧,想换个思路解决问题。谢谢
作者: vszy    时间: 2016-3-16 19:42     标题: 全盘搜索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   ,今天又改了下还是无果,特来请教各位朋友。
作者: /zhqsystem/zhq    时间: 2016-3-16 20:31

本帖最后由 /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. )
复制代码

作者: vszy    时间: 2016-3-16 20:40

回复 7# /zhqsystem/zhq

不知道你这个是不是完整代码,运行就是这个结果。
作者: vszy    时间: 2016-3-16 23:01

  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文件就往下执行别的或退出该怎么加入?
作者: CrLf    时间: 2016-3-16 23:30

回复 9# vszy


    Echo.%%~dpb%%j
作者: /zhqsystem/zhq    时间: 2016-3-17 04:12

回复 8# vszy
变量延迟,看你自己都会编写简单的了,怎么就看不到!!!!!!!变量延迟符号呢,无语
作者: ygqiang    时间: 2016-3-17 06:44

回复 9# vszy


    @echo off&setlocal enableDelayedExpansion

代码开头加上这个。。
作者: flyinnet9    时间: 2016-3-17 09:54

回复 4# vszy


    实测并没有死机,start少了"",把有start那一行改成:
  1. if "%%c"=="NAME2" start "" "%%~dpb%%d"
复制代码
另外看起来使用wmic的2个脚本都有类似死机的症状,你可以在命令行运行wmic LogicalDisk where "DriveType='3'" get DeviceID看看结果
如果确实是wmic的问题,那就用枚举驱动器的方法代替wmic部分也行也行
作者: vszy    时间: 2016-3-17 11:29

本帖最后由 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就执行别的或退出
这样要怎么写?
作者: vszy    时间: 2016-3-17 11:32

本帖最后由 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.......
这样要怎么改写?
作者: flyinnet9    时间: 2016-3-18 10:03

直接运行,不匹配ITEM?

start /wait "" "%%~dpb%%d"
作者: vszy    时间: 2016-3-18 16:16

回复 16# flyinnet9


   是匹配多个ITEM,然后依次等待运行。先运行QQ.exe等待完成在运行RAR.EXE等待完成...........
作者: flyinnet9    时间: 2016-3-18 16:28

if "%%c"=="ITEM1" start/wait "" "%%~dpb%%d"
if "%%c"=="ITEM2" start/wait "" "%%~dpb%%d"
if "%%c"=="ITEM3" start/wait "" "%%~dpb%%d"
作者: vszy    时间: 2016-3-18 19:00

回复 18# flyinnet9


    我的意思是
if "%%c"=="ITEM1" start/wait "" "%%~dpb%%d"

这一行命令不能实现ITEM1自动递增吗?因为INI里有几个ITEM是不确定的啊。就是以后只改INI文件,而不需要改动BAT就可实现变化。
再次感谢了!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2