Пакетные файлы Windows: если еще


Я делаю простой пакетный файл, который требует одного аргумента (вы можете предоставить больше, но я их игнорирую).

для тестирования, это то, что у меня есть до сих пор.

if not %1 == "" (
    dir /s/b %1
) else (
    echo no
)

в принципе, я хочу сказать, если аргумент предоставляется, рекурсивно отображать все файлы в папке. В противном случае скажите "нет".

он работает, когда я предоставляю аргумент, но если я его не предоставлю, он просто скажет мне ( was unexpected at this time.

Я имею в виду, это работает, но я хотел хотя бы показать удобное сообщение, объясняющее, почему он не работает. Как я должен изменить код?

6 59

6 ответов:

if not %1 == "" (

должно быть

if not "%1" == "" (

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

окружите свою %1 С чем-то.

например:

if not "%1" == ""

еще один я видел довольно часто:

if not {%1} == {}

и так далее...

проблема, как вы, вероятно, догадываетесь, заключается в том, что %1 буквально заменяется пустотой. Это не "пустая строка", это на самом деле пустое место в исходном файле в этот момент.

затем после замены интерпретатор пытается разобрать if заявление и получает смущенный.

вы должны сделать следующее:

if "%1" == "" (
    echo The variable is empty
) ELSE (
    echo The variable contains %1
)

другой связанный совет-использовать " %~1 "вместо"%1". Введите " вызов /?"в командной строке в Windows, чтобы получить более подробную информацию.

альтернативой было бы установить переменную и проверить, определена ли она:

SET ARG=%1
IF DEFINED ARG (echo "It is defined: %1") ELSE (echo "%%1 is not defined")

к сожалению, с помощью %1 непосредственно с DEFINED не работает.

вы должны сделать вот так...

Если не "A%1" = = "A"

Если входной аргумент %1 равен null, ваш код будет иметь проблемы.