Пакет, если он существует внутри цикла For, не работает?

#batch-file #for-loop

#пакетный файл #for-loop

Вопрос:

Я пишу пакетный файл, который перебирает локальные диски на ПК и проверяет наличие файла в корне диска. Если файл существует, я хочу, чтобы ты что-то сделал, а если он не существует, я хочу сделать что-то еще, но оператор If Exists не работает. Вот фрагмент кода:

 @echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "tokens=2 delims==" %%D in ('"wmic logicaldisk where drivetype=3 get name /format:value"') do (
  echo %%D
  if exist %%Dfile.txt (
    echo Processing Drive %%D
    Do Something ...
  ) else (
    Do Something Else ...
  )
)
goto :EOF
  

Если я перемещу блок If из цикла For и помечу его как подпрограмму в командном файле и вызову его из цикла For, он будет работать нормально, но я хотел бы понять, почему он не работает внутри цикла For.

Комментарии:

1. Извините, но «не работает» не помогает. Можете ли вы подробнее остановиться на этой части?

Ответ №1:

Если вы измените свою echo %%D строку, echo ...[%%D]... вы увидите, почему она терпит неудачу.

Вывод WMIC включает дополнительный возврат каретки в свой вывод, который необходимо удалить

 @echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "tokens=2 delims==" %%a in (
    '"wmic logicaldisk where drivetype=3 get name /format:value"'
) do for %%D in (%%a) do (
  echo ....[%%D]....
  if exist %%Dfile.txt (
    echo Processing Drive %%D
  ) else (
    echo Skipping Drive %%D
  )
)
goto :EOF
  

В этом случае дополнительный for обработает проблему, удалив дополнительный CR.