Использование параметров в пакетных файлах в командной строке Windows
В Windows, как вы получаете доступ к аргументам, переданным при запуске командного файла?
Например, скажем, у меня есть программа с именем hello.bat
. Когда я ввожу hello -a
в командной строке Windows, как я могу сообщить своей программе, что -a
был передан как аргумент?
Ответы
Ответ 1
Как уже говорили другие, параметры, проходящие через командную строку, могут быть доступны в пакетных файлах с обозначением %1
до %9
. Есть также два других токена, которые вы можете использовать:
-
%0
имя исполняемого файла (командного файла), указанное в командной строке.
-
%*
все параметры, указанные в командной строке - это очень полезно, если вы хотите перенаправить параметры в другую программу.
В дополнение к простому доступу к параметрам есть множество важных приемов.
Проверка, прошел ли параметр
Это делается с конструкциями типа IF "%~1"==""
, который является истинным тогда и только тогда, когда никакие аргументы вообще не передавались. Обратите внимание на символ тильды, который заставляет любые окружающие кавычки удаляться из значения %1
; без тильды вы получите неожиданные результаты, если это значение включает в себя двойные кавычки, включая возможность синтаксических ошибок.
Обработка более 9 аргументов (или просто облегчение жизни)
Если вам нужно получить доступ к более чем 9 аргументам, вы должны использовать команду SHIFT
. Эта команда сдвигает значения всех аргументов в одном месте, так что %0
принимает значение %1
, %1
принимает значение %2
и т.д. %9
принимает значение десятого аргумента (если один присутствует), который не был доступен через любую переменную перед вызовом SHIFT
(введите команду SHIFT /?
для получения дополнительных параметров).
SHIFT
также полезен, когда вы хотите легко обрабатывать параметры, не требуя, чтобы они были представлены в определенном порядке. Например, script может распознавать флаги -a
и -b
в любом порядке. Хорошим способом анализа командной строки в таких случаях является
:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!
Эта схема позволяет анализировать довольно сложные командные строки, не сойдя с ума.
Замена параметров партии
Для параметров, которые представляют имена файлов, оболочка предоставляет множество функций, связанных с работой с файлами, которые недоступны каким-либо другим способом. Доступ к этой функциональности осуществляется с помощью конструкций, начинающихся с %~
.
Например, чтобы получить размер файла, переданного в качестве аргумента, используйте
ECHO %~z1
Чтобы получить путь к каталогу, из которого был запущен командный файл (очень полезно!), вы можете использовать
ECHO %~dp0
Вы можете просмотреть весь спектр этих возможностей, введя CALL /?
в командной строке.
Ответ 2
Использование параметров в пакетных файлах:% 0 и% 9
Пакетные файлы могут ссылаться на слова, переданные в качестве параметров с токенами: %0
до %9
.
%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.
параметры, переданные в командной строке, должны быть буквенно-цифровыми символами и разделены пробелами. Поскольку %0
- это имя программы, которое было вызвано, в DOS %0
будет пусто для AUTOEXEC.BAT, если оно запущено во время загрузки.
Пример:
Поместите следующую команду в пакетный файл с именем mybatch.bat
:
@echo off
@echo hello %1 %2
pause
Вызов командного файла следующим образом: mybatch john billy
будет выводить:
hello john billy
Получить более 9 параметров для пакетного файла, используйте:% *
Значок Процент Звезды %*
означает "остальные параметры". Вы можете использовать цикл for для их захвата, как определено здесь:
http://www.robvanderwoude.com/parameters.php
Заметки о разделителях для параметров партии
Некоторые символы в параметрах командной строки игнорируются пакетными файлами, в зависимости от версии DOS, независимо от того, являются ли они "экранированными" или нет, и часто в зависимости от их местоположения в командной строке:
commas (",") are replaced by spaces, unless they are part of a string in
double quotes
semicolons (";") are replaced by spaces, unless they are part of a string in
double quotes
"=" characters are sometimes replaced by spaces, not if they are part of a
string in double quotes
the first forward slash ("/") is replaced by a space only if it immediately
follows the command, without a leading space
multiple spaces are replaced by a single space, unless they are part of a
string in double quotes
tabs are replaced by a single space
leading spaces before the first command line argument are ignored
Ответ 3
Используйте переменные, т.е. переменные .BAT
и называемые %0
to %9
Ответ 4
Пакетные файлы автоматически передают текст после программы, пока их переменные назначают. Они передаются, чтобы они были отправлены; например % 1 будет первой строкой, посланной после вызова программы и т.д.
Если у вас есть Hello.bat и содержимое:
@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause
и вы вызываете команду batch в команде через
hello.bat APerson241% date%
вы должны получить это сообщение:
Здравствуйте, APerson241 благодарит за запуск этого командного файла (01/11/2013)