2015-07-11 95 views
2

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

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”或“呼叫myScript.bat”运行该文件,我得到一个错误:

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

\windows\system32\find.exe was unexpected at this time.

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

C:\Users\UUI\Desktop>

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

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

回答

2

你需要用来标记在一个批处理脚本(.bat.cmd)一个FOR循环控制变量的%符号,即使用%%i代替纯CLI使用%i

但是,如何解析wmic输出还有另一种可能的方法。 另见戴夫贝纳姆的WMIC and 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行为:每条输出线与0x0D0D0ACR+CR+LF)结束,而不是共同0x0D0ACR+LF)。

人们可以使用CaptionName代替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 

脚本输出 F或没有,然后一个然后2分别 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 

==>