2015-07-11 3 views
2

Я пытаюсь написать сценарий, который обнаружит письмо моего USB-съемного диска под названием «UUI», а затем создаст на нем папку. Я написал несколько команд для CMD, которые работают при работе отдельно. Однако, когда я помещаю их в файл 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

Вы должны двойной в % знак используется для обозначения переменной управления FOR цикла в пакетном сценарии (.bat или .cmd), то есть использовать %%i вместо %i используется в чистом CLI.

Однако есть еще один возможный подход, как разобрать wmic. Смотрите также Дэйв Benham-х 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 поведения: каждая выходная линия заканчивается 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:\bat\SO\31356732.bat 
USBCounter=0 

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

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

==> 
Смежные вопросы