标题: [文件操作] [已解决]存在多个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:),不知道是哪里出了问题。
于是又找了度娘,得到以下命令可以获得两个盘符:- @echo off&title 查看可移动盘个数及盘符
- 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 "可移动"
- pause
复制代码
接下来开始研究在获取的U盘路径里搜索并运行,查到以下命令:- 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 (
- if exist %%~a:\ for /f "delims=" %%b in ('dir /a-d/s/b "%%~a:\QQ.exe"') do start "" "%%~b"
- )
复制代码
但这个是全盘搜索,很费时间。不知道怎么改成只搜索获取到的那两个U盘,还有就是如果存在同名文件怎么指定运行最后盘符那个?
个人能力实在有限了,望有经验的朋友帮助一下,谢谢!
刚刚又有个想法,已知条件:在U盘下有个test.ini文件(U盘盘符和test.ini所在目录不确定),test.ini内容如下:- [Common]
- NAME1=1.EXE
- NAME2=2.EXE
- 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 - echo 可移动盘:
- 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 (
- fsutil fsinfo drivetype %%a: | find "可移动">nul && (echo %%a) && (
-
- if exist %%a:\ for /f "delims=" %%b in ('dir /a-d/s/b "%%a:\QQ.txt"') do start "" "%%b"
-
- )
- )
复制代码
如果同时存在。就将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盘盘符- @echo off
- setlocal enabledelayedexpansion
- for /f "skip=1" %%a in ('wmic LogicalDisk where "DriveType='2'" get DeviceID') do (
- set /a n+=1
- set d!n!=%%a
- )
- set /a m=n-1
- for /l %%a in (%m%,-1,1) do (
- for /f "delims=" %%b in ('dir /a-d /s /b !d%%a!\test.ini') do (
- if exist "%%b" (
- for /f "tokens=1-2 delims==" %%c in (%%b) do (
- if "%%c"=="NAME2" start "%%~dpb%%d"
- )
- goto :eof
- )
- )
- )
复制代码
作者: 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内容如下:- [Common]
- NAME1=1.EXE
- NAME2=2.EXE
- 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
昨晚找了一些资料,也整合了以下代码:- @echo off
- rem 指定待搜索的文件
- set "FileName=test.ini"
- echo 正在搜索,请稍候...
- 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 (
- if exist %%a:\ (
- pushd %%a:\
- for /r %%b in (*%FileName%) do (
- if /i "%%~nxb" equ "%FileName%" (
- echo,%%b
- )
- )
- popd
- )
- )
- pause
复制代码
和- @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
- for /f "delims=" %%i in ('wmic logicaldisk get caption /value^|find/i "caption="')do (set "%%i"
- for /f "delims=" %%j in ('dir/a-d/s/b/l/on "!caption!\*.ini"')do if /i "%%~nxj"=="test.ini" (
- for /f "takens=1,* delims==" %%k in ('type "%%j"')do (set "name=%%k"
- for /l %%n in (1,1,1000)do (
- if /i "name%%n"=="!name!" (
- echo,"%%~dpj%%~nxl"
- )
- )
- )
- )
- )
复制代码
作者: vszy 时间: 2016-3-16 20:40
回复 7# /zhqsystem/zhq
不知道你这个是不是完整代码,运行就是这个结果。
作者: vszy 时间: 2016-3-16 23:01
- @echo off
- rem 指定待搜索的文件
- set "FileName=vszy.ini"
- echo 正在搜索,请稍候...
- 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 (
- if exist %%a:\ (
- pushd %%a:\
- for /r %%b in (*%FileName%) do (
- if /i "%%~nxb" equ "%FileName%" (
- For /f "tokens=1-2 delims==" %%i in (%%b) do (If /i "%%i"=="NAME" Echo.%%b%%j)
- )
- )
- )
- )
- 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那一行改成:- 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文件内容如下:- [Common]
- ITEM1=QQ.EXE
- ITEM2=RAR.EXE
- ITEM3=PS.EXE
- ..............
复制代码
让批处理检测到INI并获取后先运行QQ.EXE等待完成,再运行RAR.EXE.......,如果没检测到INI就执行别的或退出
这样要怎么写?
作者: vszy 时间: 2016-3-17 11:32
本帖最后由 vszy 于 2016-3-17 14:29 编辑
回复 13# flyinnet9
谢谢朋友了,的确加了两个冒号问题解决了。还想追问下(不好意思了)
如果INI文件内容如下:- [Common]
- ITEM1=QQ.EXE
- ITEM2=RAR.EXE
- ITEM3=PS.EXE
- ..............
复制代码
让批处理检测到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 |