Оператор IF прерывает пакетный скрипт

#batch-file

#пакетный файл

Вопрос:

Я пишу пакетный скрипт для извлечения видеофайлов из их каталогов.
Пока что он попадает в каталог, соответствующий определенному имени. Затем я выполняю FOR цикл по каждому элементу в этом каталоге. Я хочу проверить, является ли элемент каталогом (что я делал ранее), если это так, то перейдите в этот каталог, иначе выполните другие действия.

Проблема в том, что 2-я IF инструкция (для проверки, является ли элемент каталогом или нет) прерывает пакетный скрипт, выдавая ошибку:

) было неожиданным в это время

Если я удалю это IF , код будет выполняться как ожидалось (я четко указал, какой IF оператор это есть в коде)…

код:

 @ECHO off

SET title=%1
SET mp4=".mp4"
SET mkv=".mkv"
SET avi=".avi"
SET minimumSize=300
SET needCompressingDir="E:DocumentsFilmsNeed_compressing"

CD %needCompressingDir%
FOR /f "delims=" %%i IN ('DIR /B') DO (
    IF %%i == %title% (
        IF EXIST %%i (
            CD %%i
            FOR /f "delims=" %%j IN ('DIR /B') DO (
                rem this 'IF' statement breaks it
                IF EXIST %%j (

                ) ELSE (

                )
            )
        ) ELSE (
            MOVE %%i %needCompressingDir%
        )
    )
)
  

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

1. Может ли какое-либо из имен файлов, возвращаемых %%j , содержать пробелы? Вместо этого вам следует попробовать использовать if exist "%%j" if exist "%%i" ранее).

2. @SomethingDark да, это вполне возможно, что это может произойти, спасибо за понимание и попробую этот подход, когда смогу

3. попробуйте с IF EXIST "%%~j"

Ответ №1:

Читать if /? :

 Performs conditional processing in batch programs.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
…
  command           Specifies the command to carry out if the condition is
                    met.  Command can be followed by ELSE command which
                    will execute the command after the ELSE keyword if the
                    specified condition is FALSE

The ELSE clause must occur on the same line as the command after the IF.  For
example:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )
  

Вы можете видеть, что это command является обязательной частью обеих if и else частей. Интерпретатор Windows cmd / .bat не принимает пустой командный блок () : он не считается командой. Используйте хотя бы REM комментарий (команда без эффекта):

         FOR /f "delims=" %%j IN ('DIR /B') DO (
            rem this 'IF' statement breaks it
            IF EXIST "%%~j" (
              rem directory
            ) ELSE (
              rem not directory
            )
        )
  

Обновлено: используйте IF EXIST "%%~j" (обратите внимание на обратную косую черту в конце) , чтобы проверить, является ли элемент каталогом или нет.