Как я могу проверить, определен ли аргумент при запуске/вызове пакетного файла?

Я пытаюсь использовать следующую логику проверки в пакетном файле, но блок "использование" никогда не выполняется, даже если в пакетный файл не задан параметр.

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

Что я делаю неправильно?

Ответ 1

Проверка наличия аргумента командной строки может быть [%1]==[], но, как Dave Costa указывает, "%1"=="" также будет работать.

Я также исправил синтаксическую ошибку в эхо-сигнале использования, чтобы избежать знаков большего и меньшего размера. Кроме того, для exit нужен аргумент /B, иначе CMD.exe закроется.

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

Ответ 2

Избавьтесь от круглых скобок.

Пример командного файла:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

Выход из работы выше script:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

Я думаю, что на самом деле они берут круглые скобки, чтобы быть частью строк, и они сравниваются.

Ответ 3

Более продвинутый пример:

⍟ неограниченные аргументы.

⍟ существуют в файловой системе (либо file или directory?), либо общий string.

⍟ указать, является ли файл

⍟ указать каталог

⍟ нет расширений, будет работать в старых сценариях!

⍟ минимальный код ☺

@echo off

:loop
      ::-------------------------- has argument ?
      if ["%~1"]==[""] (
        echo done.
        goto end
      )
      ::-------------------------- argument exist ?
      if not exist %~s1 (
        echo not exist
      ) else (
        echo exist
        if exist %~s1\NUL (
          echo is a directory
        ) else (
          echo is a file
        )
      )
      ::--------------------------
      shift
      goto loop


:end

pause

✨ прочее.

■ в %~1 - ~ удаляет любые обертывания " или '.

■ в %~s1 - s делает путь DOS 8.3 naming, что является хорошим трюком, чтобы избежать пробелов в имени файла при проверке материала (и таким образом нет необходимости обертывать ресурс более " s.

["%~1"]==[""] "не может быть уверенным", если аргумент является файлом/каталогом или просто общей строкой, поэтому вместо этого выражение использует скобки и исходный немодифицированный %1 (только без упаковки ", если есть..)

если не было аргументов, если мы использовали shift, а указатель arg-list прошел последний, выражение будет оцениваться как [""]==[""].

■ Это настолько специфично, что вы можете не использовать больше трюков (он будет работать даже в пакетных сценариях Windows-95...)

■ примеры выполнения

сохраните его как identifier.cmd

он может идентифицировать неограниченные аргументы (обычно вы ограничены %1 - %9), просто не забудьте обернуть аргументы с помощью перевернутых запятых или использовать имя именования 8.3 или перетащить их (оно автоматически делает либо выше).


это позволяет запускать следующие команды:

identifier.cmd c:\windows и получить

exist
is a directory
done

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" и получить

exist
is a file
done

⓷ и несколько аргументов (конечно, это целая сделка.)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

и получить

exist
is a directory
exist
is a file
exist
is a file
not exist
done.

Естественно, это может быть намного сложнее, , но хорошие примеры всегда должны быть простыми и минимальными.:)

Надеюсь, это поможет кому угодно:)

опубликовано здесь: CMD Ninja - обработка неограниченных аргументов, идентификация, если существует в файловой системе, идентификация файла или каталога

и вот рабочий пример, который принимает любое количество файлов APK (приложения для Android) и устанавливает их на вашем устройстве через debug-console (ADB.exe): Сделать предыдущий пост Массовый установщик APK, который не использует синтаксис ADB Install-Multi

Ответ 4

IF "%~1"=="" GOTO :Usage

~ будет декатировать% 1, если сам% 1.

"" защитит от переданных специальных символов. например, вызов script с помощью & ping

Ответ 5

IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given

Ответ 6

ЕСЛИ "% 1" == "" потерпит неудачу, все версии этого будут терпеть неудачу при определенных условиях ядовитых символов. Только ЕСЛИ ОПРЕДЕЛЕНО или ЕСЛИ НЕ ОПРЕДЕЛЕНО являются безопасными

Ответ 7

Это то же самое, что и другие ответы, но использует только одну метку и ставит на первое место использование, что дополнительно делает его своеобразной документацией, рекомендующей сценарий, который также обычно помещается вверху:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

Однако, если вам не нужно использовать cmd/batch, использовать bash на WSL или powershell, они имеют более вменяемый синтаксис и меньше загадочных возможностей.