我正在尝试写一个脚本,它将检测我的USB移动驱动器的字母称为"UUI"然后在上面创建一个文件夹。我写了几个命令的CMD,当单独运行时,工作。然而,当我把它们放入一个bat文件时,我总是得到一些错误。以下是bat文件中的命令:
for /F "tokens=1 delims= " %i in ('WMIC logicaldisk where "DriveType=2" list brief ^| c:windowssystem32find.exe "UUI"') do (echo %i > drive.txt)
set /p RemovableDriveLetter2= < drive.txt
del /F /Q drive.txt
set RemovableDriveLetter=%RemovableDriveLetter2:~0,1%
%RemovableDriveLetter%:
md MyNewFolder
cd MyNewFolder
当我进入cmd.exe并通过调用"myScript.bat"运行文件时或者调用myscript .bat,我得到一个错误:
C: UUI Desktop>用户myScript.bat
windowssystem32find.exe此时出现意外
C:UsersUUIDesktop>for/F "tokens=1 delims= "windowssystem32find.exe "UUI"') do (echo i>drive.txt)
C: 用户 UUI Desktop>
我可以看到MyNewFolder没有被创建。但是,当我复制所有行并在CMD中运行它们时(例如不在。bat文件中)并逐一运行它们,它在CMD .exe实例中完全起作用。
我如何创建一个文件,它将成功运行,并检测我的移动驱动器的驱动器号没有问题?或者我如何解决错误"windowssystem32find.exe was unexpected at this ."?
您需要双用于标记批处理脚本(.bat
或.cmd
)中FOR
循环控制变量的%
符号,即使用%%i
而不是纯CLI中使用的%i
。
然而,还有另一种可能的方法来解析wmic
输出。参见Dave Benham的 WMIC
和FOR /F
:修复尾随<CR>
的问题
@echo OFF
SETLOCAL enableextensions
set "USBCounter=0"
for /F "tokens=2 delims==" %%G in ('
WMIC logicaldisk where "DriveType=2" get DeviceID /value 2^>NUL ^| find "="
') do for /F "tokens=*" %%i in ("%%G") do (
set /A "USBCounter+=1"
echo %%i
rem your stuff here
)
echo USBCounter=%USBCounter%
rem more your stuff here
ENDLOCAL
goto :eof
这里的for
循环是
-
%%G
检索DeviceID
值; -
%%i
删除返回值中的结尾回车:wmic
行为:每个输出行以0x0D0D0A
(CR+CR+LF
)结束,而不是常见的0x0D0A
(CR+LF
)。
可以使用Caption
或Name
代替DeviceID
:
==>WMIC logicaldisk where "DriveType=2" get /value | find ":"
Caption=F:
DeviceID=F:
Name=F:
注意可能有没有或者有更多磁盘存在DriveType=2
:
==>WMIC logicaldisk where "DriveType=2" get /value | find ":"
No Instance(s) Available.
==>WMIC logicaldisk where "DriveType=2" list brief
DeviceID DriveType FreeSpace ProviderName Size VolumeName
F: 2 2625454080 3918512128 HOMER
G: 2 999600128 1029734400 LOEWE
Script 输出对于没有,然后一个然后两个 USB驱动器,分别为:
==>D:batSO31356732.bat
USBCounter=0
==>D:batSO31356732.bat
F:
USBCounter=1
==>D:batSO31356732.bat
F:
G:
USBCounter=2
==>