Пакетный сценарий Windows: почему синтаксис этой команды IF неверен? - PullRequest
0 голосов
/ 06 ноября 2019

Описание

При попытке вывести на экран Init has already been made, если файл init.marker новее, чем файлы setup.py и setup.cfg с использованием пакетного сценария Windows (, гдеприведенный ниже код взят из ):

FOR /F %%i IN ('DIR /B /O:D init.marker setup.py setup.cfg') DO SET last_modified_file=%%i
IF "%last_modified_file%"=="init.marker"(
    ECHO Init has already been made
)

Я обнаружил ошибку The syntax of the command is incorrect..


Откуда произошла ошибка

Допустим, мызаписал вышеупомянутый пакетный скрипт в файл с именем make_init.cmd, который находится в том же каталоге, что и файлы init.marker, setup.py, setup.cfg. (Мы можем создать эти файлы, используя Batch Script, см. [1]. Проверьте этот ответ для получения дополнительной информации о том, как создавать пустые файлы, используя Batch Script.) Давайте использовать cmd.exe для его запуска, которыйдает нам следующий вывод:

User> make_init.cmd
User> FOR /F %i IN ('DIR /B /O:D init.marker setup.py setup.cfg') DO SET last_modified_file=%i
User> SET last_modified_file=init.marker
User> SET last_modified_file=setup.py
User> SET last_modified_file=setup.cfg
The syntax of the command is incorrect.
User> IF "setup.cfg"=="init.marker" (

Давайте сначала посмотрим, работает ли наш оператор FOR так, как задумано, запустив тот же сценарий, но заменив оператор IF для простого оператора ECHO. (См. [2])
Вывод - это то, что мы ожидаем:

User> make_init.cmd
User> COPY /B NUL  1>init.marker
User> COPY /B NUL  1>setup.py
User> COPY /B NUL  1>setup.cfg
User> FOR /F %i IN ('DIR /B /O:D init.marker setup.py setup.cfg') DO SET last_modified_file=%i
User> SET last_modified_file=init.marker
User> SET last_modified_file=setup.py
User> SET last_modified_file=setup.cfg
User> ECHO setup.cfg
setup.cfg

Насколько я понимаю, это означает, что упомянутая неправильная команда должна быть
IF "%last_modified_file%"=="init.marker" (, котораяоценивается как IF "setup.cfg"=="init.marker" (

Почему же при любых других обстоятельствах (см. [3]) такое утверждение IF полностью допустимо?


Вопрос

Что не так с синтаксисом приведенной выше команды IF?


Вложения

[1] Расширение скрипта для создания необходимых файлов.

COPY /B NUL > init.marker
COPY /B NUL > setup.py
COPY /B NUL > setup.cfg
FOR /F %%i IN ('DIR /B /O:D init.marker setup.py setup.cfg') DO SET last_modified_file=%%i
IF "%last_modified_file%"=="init.marker"(
    ECHO Init has already been made
)

[2] Замените оператор IF на оператор ECHO

COPY /B NUL > init.marker
COPY /B NUL > setup.py
COPY /B NUL > setup.cfg
FOR /F %%i IN ('DIR /B /O:D init.marker setup.py setup.cfg') DO SET last_modified_file=%%i
ECHO %last_modified_file%

[3] Простой тестовый скрипт для оператора IF

:: Filename:        test_if.cmd
:: How to execute:  test_if.cmd hello

IF "%1"=="hello" (
    SET the_greeting_message=Greetings, traveller.
)
IF "%the_greeting_message%"=="Greetings, traveller." (
    ECHO %the_greeting_message%
)

1 Ответ

1 голос
/ 06 ноября 2019

Проблема в том, что вы пропустили пробел перед последующим символом ( в командной строке if:

IF "%last_modified_file%"=="init.marker"(

Вставьте пробел перед завершающим символом (, и он должен проанализироватьправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...