Как я могу проверить, определен ли аргумент при запуске/вызове пакетного файла?
Я пытаюсь использовать следующую логику проверки в пакетном файле, но блок "использование" никогда не выполняется, даже если в пакетный файл не задан параметр.
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, они имеют более вменяемый синтаксис и меньше загадочных возможностей.