Я пытаюсь использовать следующую логику проверки в пакетном файле, но блок «использования» никогда не выполняется, даже если в пакетный файл не задан параметр.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
Что я делаю не так?
batch-file
arguments
Даниэль Фортунов
источник
источник
Ответы:
Проверка того, задан ли аргумент командной строки, может быть
[%1]==[]
, но, как указывает Дэйв Коста , также будет работать."%1"==""
Я также исправил синтаксическую ошибку в использовании эха, чтобы избежать знаков «больше» и «меньше». Вдобавок
exit
нужен/B
аргумент, иначеCMD.exe
уйдет.источник
set
переменные (я не знаю правильной терминологии пакетной обработки), вы можете захотеть использовать,"%myvar%"==""
потому что, если в немmyvar
есть пробелы и не указаны в кавычках, вы получите сообщение «неожиданно. "сообщение.IF NOT DEFINED VarName
блока. Также +1 к тукушану за то, что не использовал кавычки в сравнении. Просто не делай этого. Никогда."%~1"==""
также будет работать и позаботится о случае, когда% 1 имеет двойные кавычки"%~1"==""
обрабатывает пробелы в переменной, а[]
версия - нет.✨ прочее ..✨
■ в
%~1
-~
удаляет любую упаковку"
или'
.■ in
%~s1
-s
делает путь равнымDOS 8.3 naming
, что является хорошим трюком, позволяющим избежать пробелов в имени файла при проверке материала (и, таким образом, не нужно оборачивать ресурс дополнительными"
s.■
["%~1"]==[""]
«не могу быть уверенным», является ли аргумент файлом / каталогом или просто стандартной строкой, поэтому вместо этого в выражении используются скобки и исходное немодифицированное%1
(только без"
упаковки, если таковая имеется ..)если не было аргументов, если мы использовали,
shift
и указатель на список аргументов прошел последний, выражение будет вычислено[""]==[""]
.■ это настолько специфично, насколько это возможно, не прибегая к дополнительным уловкам (это будет работать даже в пакетных скриптах Windows 95 ...)
■ примеры исполнения
сохраните это как
identifier.cmd
он может идентифицировать неограниченное количество аргументов (обычно вы ограничены
%1
-%9
), просто не забудьте заключить аргументы в кавычки, или использовать именование 8.3, или перетащить их поверх (он автоматически выполняет любое из вышеперечисленных).это позволяет запускать следующие команды:
⓵
identifier.cmd c:\windows
и получить⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
и получить⓷ и несколько аргументов (конечно, в этом вся суть ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
и получить
естественно, это может быть намного сложнее, но хорошие примеры всегда должны быть простыми и минимальными. :)
Надеюсь, это поможет кому-нибудь :)
опубликовано здесь: CMD Ninja - Неограниченная обработка аргументов, определение наличия в файловой системе, определение наличия файла или каталога
и вот рабочий пример, который берет любое количество файлов APK (приложений Android) и устанавливает их на ваше устройство через консоль отладки (ADB.exe): Сделайте предыдущий пост массовым установщиком APK, который не использует синтаксис ADB Install-Multi
источник
Избавьтесь от скобок.
Пример командного файла:
Результат выполнения вышеуказанного скрипта:
Я думаю, что на самом деле скобки являются частью строк, и они сравниваются.
источник
if "%1"==""
произойдет сбой, если в аргументе есть пробелы. Например:run.bat "a b"
. У @amr есть лучший ответ для использованияif "%~1"==""
~ снимет кавычки с% 1, если указан сам% 1.
"" защитит от пропущенных специальных символов. например, вызов скрипта с помощью & ping
источник
run.bat "a b"
run.bat ""
не поймают с[%1]==[]
.источник
run.bat "a b"
Это то же самое, что и другие ответы, но использует только одну метку и ставит использование первым, что дополнительно делает его своего рода документацией к сценарию, который также обычно помещается вверху:
Однако, если вам не нужно использовать cmd / batch, используйте bash в WSL или PowerShell, они имеют более разумный синтаксис и меньше загадочных функций.
источник
ЕСЛИ "% 1" == "" завершится ошибкой, все версии этого не будут выполнены при определенных условиях ядовитого символа. Только IF DEFINED или IF NOT DEFINED безопасны
источник
if [not] defined ...
не работает с такими параметрами, как%1
. У вас есть пример, гдеif "%~1" ...
не работает?