Проблема с функциями ‘If exist’ и ‘else’ в пакетном скрипте

#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"
        )
    )
)