Обнаружение буквы съемного диска в CMD

Я пытаюсь написать скрипт, который будет определять букву моего съемного 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 \ ИДП \ Desktop> myScript.bat

\ windows \ system32 \ find.exe в это время был неожиданным.

C: \ Users \ UUI \ Desktop> для / 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 была неожиданной в это время."?

1 ответ

Решение

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

Тем не менее, есть еще один возможный подход, как разобрать wmic выход. Смотрите также Дейва Бенхама 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

Вывод сценария для 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

==>
Другие вопросы по тегам