Проблема с функциями «Если существует» и «еще» в пакетном скрипте - PullRequest
1 голос
/ 28 марта 2019

Итак, я хочу запустить операцию (обозначенную 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 rd , сценарий будет работать так, как задумано, но я буду продолжать получать эту ошибку

«Do» не распознается как внутренняя или внешняя команда

Могу ли я получить некоторую помощь по вопросу о том, как заставить скрипт работать так, как задумано, без подсказок?

1 Ответ

1 голос
/ 28 марта 2019

Почему вы добавляете do в этом месте? If Exist "%%A\*.mkv" ( Do something ) будет запускать команду с именем do, если файл существует, но, поскольку эта команда не существует, выполнение завершится с сообщением выше

В цикле for слово 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"
        )
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...