#batch-file #if-statement #exists
#пакетный файл #оператор if #существует
Вопрос:
Итак, я хочу запустить операцию (обозначаемую S1
) в подкаталогах только при условии, что подкаталог содержит .mkv
файл вместе с .ttf
/ .otf
файлом. Это то, что я сделал до сих пор…
For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"'
) Do If Exist "%%A*.mkv" (
If Exist "%%A*.ttf" (
If Not Exist "Revised" MD "Revised" 2>Nul||Exit /B
Call :S1 "%%A")
) else (
If Exist "%%A*.otf" (
If Not Exist "Revised" MD "Revised" 2>Nul||Exit /B
Call :S1 "%%A"))
GoTo :EOF
Проблема заключается в том, что S1
операция выполняется только при наличии .otf
файла, а не сам .ttf
файл. Однако, если я сделаю это…
For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"'
) Do If Exist "%%A*.mkv" (
Do If Exist "%%A*.ttf" (
If Not Exist "Revised" MD "Revised" 2>Nul||Exit /B
Call :S1 "%%A")
) else (
If Exist "%%A*.otf" (
If Not Exist "Revised" MD "Revised" 2>Nul||Exit /B
Call :S1 "%%A"))
GoTo :EOF
Добавив Do
прямо перед If Exist
в 3-ю-ю строку, скрипт функционирует как задумано, но я бы продолжал получать эту ошибку
‘Do’ не распознается как внутренняя или внешняя команда
Могу ли я, пожалуйста, получить некоторую помощь в решении проблемы с запуском скрипта по назначению без подсказок?
Ответ №1:
Почему вы добавляете do
в этом месте? If Exist "%%A*.mkv" ( Do something )
будет запущена команда с именем do
, если файл существует, но поскольку эта команда не существует, выполнение завершится ошибкой с приведенным выше сообщением
В for
цикле word do
является ключевым словом, которое является частью синтаксиса, поэтому вы должны использовать его перед командой, которую хотите запускать в каждом цикле. Запустите for /?
, чтобы получить справку о синтаксисе
Кроме того, ваше описание неясно. Вы хотите вызвать S1, если
- существует (*.mkv и *.ttf) или (*.otf), или
- существуют (*.mkv) и (*.ttf или *.otf)?
Ваш код выполняет первое. Это трудно увидеть, потому что ваш отступ ужасен. Вот это после исправления
For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"') Do (
If Exist "%%A*.mkv" (
If Exist "%%A*.ttf" (
If Not Exist "Revised" MD "Revised" 2>Nul||Exit /B
Call :S1 "%%A"
)
) else (
If Exist "%%A*.otf" (
If Not Exist "Revised" MD "Revised" 2>Nul||Exit /B
Call :S1 "%%A"
)
)
)
Но почему вы используете 2 противоречивых параметра ( /V
и /X
) в findstr
? И люди часто используют все строчные или все заглавные буквы для команд / ключевых слов, а не camelCase подобным образом. Итак, чтобы проверить последнее условие, вы можете использовать это
for /f delims^=^ eol^= %%a in ('dir /b /ad 2^>nul ^| findstr /IVXC:"Revised"') do (
if exist "%%a*.mkv" (
if exist "%%a*.ttf" (
if not exist "Revised" md "Revised" 2>nul || exit /b
Call :S1 "%%a"
)
if exist "%%a*.otf" (
if not exist "Revised" md "Revised" 2>nul || exit /b
call :S1 "%%a"
)
)
)