[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]存在多个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: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

TOP

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

TOP

回复 3# flyinnet9


    先谢谢这位兄弟了,但实测无效,而且死机了。

TOP

请版主封贴吧,想换个思路解决问题。谢谢

TOP

全盘搜索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   ,今天又改了下还是无果,特来请教各位朋友。
1

评分人数

TOP

本帖最后由 /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. )
复制代码
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

回复 7# /zhqsystem/zhq

不知道你这个是不是完整代码,运行就是这个结果。

TOP

  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文件就往下执行别的或退出该怎么加入?

TOP

回复 9# vszy


    Echo.%%~dpb%%j

TOP

回复 8# vszy
变量延迟,看你自己都会编写简单的了,怎么就看不到!!!!!!!变量延迟符号呢,无语
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

回复 9# vszy


    @echo off&setlocal enableDelayedExpansion

代码开头加上这个。。

TOP

回复 4# vszy


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

TOP

本帖最后由 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就执行别的或退出
这样要怎么写?

TOP

本帖最后由 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.......
这样要怎么改写?

TOP

返回列表