#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"
(обратите внимание на обратную косую черту в конце) , чтобы проверить, является ли элемент каталогом или нет.