В Windows, как вы получаете доступ к аргументам, передаваемым при запуске командного файла?
Например, допустим, у меня есть программа с именем hello.bat
. Когда я вхожу hello -a
в командную строку Windows, как я могу сообщить своей программе, что она -a
была передана в качестве аргумента?
windows
batch-file
cmd
parameters
arguments
Персона
источник
источник
Ответы:
Как и другие уже говорил, параметры , передаваемые через командную строку можно получить в пакетных файлах с пометкой
%1
в%9
. Есть также два других токена, которые вы можете использовать:%0
это исполняемый файл (пакетный файл) имя , как указано в командной строке .%*
это все параметры, указанные в командной строке - это очень полезно, если вы хотите переслать параметры в другую программу.Есть также много важных методов, о которых нужно знать в дополнение к простому способу доступа к параметрам.
Проверка, был ли передан параметр
Это делается с помощью конструкций like
IF "%~1"==""
, что верно, если и только если никакие аргументы не были переданы вообще. Обратите внимание на символ тильды, который приводит к удалению любых окружающих кавычек из значения%1
; без тильды вы получите неожиданные результаты, если это значение включает двойные кавычки, включая возможность синтаксических ошибок.Обработка более 9 аргументов (или просто облегчение жизни)
Если вам нужно получить доступ более чем к 9 аргументам, вы должны использовать команду
SHIFT
. Эта команда сдвигает значения всех аргументов на одно место, так что%0
принимает значение%1
,%1
принимает значение%2
и т. Д.%9
Принимает значение десятого аргумента (если он есть), который не был доступен ни для одной переменной перед вызовомSHIFT
(введите командаSHIFT /?
для дополнительных параметров).SHIFT
также полезно, когда вы хотите легко обработать параметры, не требуя, чтобы они были представлены в определенном порядке. Например, скрипт может распознавать флаги-a
и-b
в любом порядке. Хороший способ разбора командной строки в таких случаяхЭта схема позволяет вам анализировать довольно сложные командные строки, не сходя с ума.
Подстановка параметров партии
Для параметров, представляющих имена файлов, оболочка предоставляет множество функций, связанных с работой с файлами, которые недоступны никаким другим способом. Эта функциональность доступна с конструкциями, которые начинаются с
%~
.Например, чтобы получить размер файла, переданного в качестве аргумента, используйте
Чтобы получить путь к каталогу, из которого был запущен командный файл (очень полезно!), Вы можете использовать
Вы можете просмотреть весь спектр этих возможностей, введя
CALL /?
в командной строке.источник
"name=John"
станетname John
во время exe. Обходной путь должен'"name=John"'
CALL /?
? Здесь я все время сталкиваюсь с Google.Использование параметров в пакетных файлах:% 0 и% 9
Пакетные файлы могут ссылаться на слова, передаваемые в качестве параметров с токенами:
%0
to%9
.параметры, передаваемые в командной строке, должны быть буквенно-цифровыми символами и разделяться пробелами. Так
%0
как это имя программы, как оно было вызвано, в DOS%0
для AUTOEXEC.BAT будет пусто, если оно будет запущено во время загрузки.Пример:
Поместите следующую команду в командный файл с именем
mybatch.bat
:Вызов командного файла следующим образом:
mybatch john billy
приведет к выводу:Получите более 9 параметров для командного файла, используйте:% *
Маркер Percent Star
%*
означает «остальные параметры». Вы можете использовать цикл for, чтобы получить их, как определено здесь:http://www.robvanderwoude.com/parameters.php
Примечания о разделителях для параметров партии
Некоторые символы в параметрах командной строки игнорируются пакетными файлами, в зависимости от версии DOS, независимо от того, «экранированы» они или нет, и часто в зависимости от их расположения в командной строке:
источник
Пакетные файлы автоматически передают текст после программы, если они являются переменными для назначения их. Они передаются в порядке их отправки; Например,% 1 будет первой строкой, отправленной после вызова программы и т. д.
Если у вас есть Hello.bat и содержимое:
и вы вызываете пакет в команде через
Вы должны получить это сообщение обратно:
Здравствуйте, APerson241, спасибо за запуск этого командного файла (01/11/2013)
источник
@ Джон
:parse
/:endparse
схемы является отличным началом, и он имеет свою благодарность за начальный проход, но если вы думаете , что мучительная партия система Windows , позволит вам легко выключить , что ... ну, мой друг, ты в шок. Я провел целый день с этой чертовщиной, и после долгих мучительных исследований и экспериментов мне наконец-то удалось что-то жизнеспособное для реальной полезности.Допустим, мы хотим реализовать утилиту
foobar
. Требуется начальная команда. Он имеет необязательный параметр,--foo
который принимает необязательное значение (которое, конечно, не может быть другим параметром); если значение отсутствует, по умолчанию используется значениеdefault
. Он также имеет необязательный параметр,--bar
который принимает требуемое значение. Наконец, он может принимать флаг--baz
без значения. Ох, и эти параметры могут прийти в любом порядке.Другими словами, это выглядит так:
Сложно? Нет, это кажется довольно типичным для реальных утилит. (
git
кто-нибудь?)Без лишних слов, вот решение:
Да, это действительно так плохо. Смотрите мой аналогичный пост на https://stackoverflow.com/a/50653047/421049 , где я предоставляю более подробный анализ того, что происходит в логике, и почему я использовал определенные конструкции.
Уродство. Большую часть этого я должен был выучить сегодня. И это больно.
источник
Использовать переменные т.е.
.BAT
переменные и называются%0
в%9
источник