2

我正在尝试编写一个脚本,它将检测我的 USB 可移动驱动器的字母“UUI”,然后在其上创建文件夹。我为 CMD 编写了一些命令,当单独运行时,它们可以工作。但是,当我将它们放入 bat 文件时,我总是会遇到一些错误。以下是 bat 文件中的命令:

for /F "tokens=1 delims= " %i in ('WMIC logicaldisk where "DriveType=2" list brief ^| c:\windows\system32\find.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”或“call myScript.bat”运行该文件时,我收到一个错误:

C:\Users\UUI\Desktop>myScript.bat

\windows\system32\find.exe 此时出乎意料。

C:\Users\UUI\Desktop>for /F "tokens=1 delims=" \windows\system32\find.exe "UUI"') 做 (echo i > drive.txt)

C:\用户\UUI\桌面>

我可以看到 MyNewFolder 没有创建。但是,当我复制所有行并在 CMD 中运行它们(例如不在 .bat 文件中)并一一运行它们时,它在 cmd.exe 实例中是完全正常的。

如何创建 bat 文件,该文件将成功运行并检测可移动驱动器的驱动器号而不会出现问题?或者我该如何解决错误“\windows\system32\find.exe 在这个时候是意外的。”?

4

1 回答 1

2

您需要将用于在批处理脚本中标记循环控制变量的符号加倍(或),即在纯 CLI 中使用而不是使用。%FOR.bat.cmd%%i%i

但是,还有另一种可能的方法来解析wmic输出。另见 Dave Benham 的WMICand FOR /F: A fix for the trailing <CR>problem

@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)。

可以使用CaptionorName代替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

no的脚本输出,然后是一个,然后是两个USB 驱动器,分别为:

==>D:\bat\SO\31356732.bat
USBCounter=0

==>D:\bat\SO\31356732.bat
F:
USBCounter=1

==>D:\bat\SO\31356732.bat
F:
G:
USBCounter=2

==>
于 2015-07-11T12:52:33.373 回答