Использование параметров в пакетных файлах в командной строке Windows
в Windows, Как получить доступ к аргументам, переданным при запуске пакетного файла?
например, предположим, у меня есть программа с именем hello.bat
. Когда я войду hello -a
в командной строке Windows, как я могу сообщить моей программе, что -a
был передан в качестве аргумента?
5 ответов
как уже говорили другие, параметры передаются через командную строку можно найти в пакетных файлах с пометкой %1
to %9
. Есть также два других токена, которые вы можете использовать:
-
%0
is имя исполняемого файла (пакетного файла), указанное в командной строке. -
%*
is все параметры, указанные в командной строке -- это очень полезно, если вы хотите переслать параметры другому программа.
есть также много важных методов, чтобы быть в курсе в дополнение к просто как получить доступ к параметрам.
проверка, если параметр был передан
это делается с помощью конструкции типа IF "%~1"==""
, что верно, если и только если аргументы не были переданы вообще. Обратите внимание на символ тильды, который заставляет любые окружающие кавычки удаляться из значения %1
; без Тильды вы получите неожиданные результаты, если это значение включает двойные кавычки, включая возможность синтаксических ошибок.
обработка более 9 аргументов (или просто облегчение жизни)
Если вам нужно получить доступ к более чем 9 аргументов, вы должны использовать команду SHIFT
. Эта команда сдвигает значения всех аргументов на одно место, так что %0
принимает значение %1
, %1
принимает значение %2
, etc. %9
принимает значение десятого аргумента (если он присутствует), который не был доступен через любая переменная перед вызовом SHIFT
(введите команду SHIFT /?
дополнительные параметры).
SHIFT
также полезно, когда вы хотите легко обрабатывать параметры, не требуя, чтобы они были представлены в определенном порядке. Например, скрипт может распознавать флаги -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 /?
в командной строке.
использование параметров в пакетных файлах: %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
пакетные файлы автоматически передают текст после программы, если они являются переменными для их назначения. Они передаются в порядке, в котором они отправляются, например, %1 станет первой строкой отправлено после того, как программа называется и т. д.
Если у вас есть Здравствуйте.летучая мышь и содержимое:
@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause
и вы вызываете пакет в команде через
Здравствуйте.bat APerson241 %дата%
вы должны получить это сообщение назад:
Привет, APerson241 спасибо за запуск этого пакетного файла (01/11/2013)
@Джон :parse
/:endparse
схема-отличное начало, и у него есть моя благодарность за первоначальный проход, но если вы думаете, что мучительная пакетная система Windows позволит вам так легко... ну, мой друг, вы находитесь в шоке. Я провел целый день с этой дьявольщиной, и после многих болезненных исследований и экспериментов мне наконец удалось что-то жизнеспособное для реальной полезности.
предположим, что мы хотим реализовать программу foobar
. Это требует начального команда. Он имеет необязательный параметр --foo
С дополнительно значение (которое, конечно, не может быть другим параметром); если значение отсутствует, оно по умолчанию равно default
. Он также имеет необязательный параметр --bar
что происходит требуются значение. Наконец он может взять флаг --baz
не допускается значения. О, и эти параметры могут быть в любом порядке.
другими словами, это выглядит так:
foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]
сложно? Нет, это довольно типично для реальной жизни. (git
кого?)
без дальнейших церемоний, вот решение:
@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson
SET CMD=%~1
IF "%CMD%" == "" (
GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=
SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
SHIFT
IF NOT "%ARG%" == "" (
IF NOT "%ARG:~0,2%" == "--" (
SET FOO=%ARG%
SHIFT
) ELSE (
SET FOO=%DEFAULT_FOO%
)
) ELSE (
SET FOO=%DEFAULT_FOO%
)
) ELSE IF "%PARAM%" == "--bar" (
SHIFT
IF NOT "%ARG%" == "" (
SET BAR=%ARG%
SHIFT
) ELSE (
ECHO Missing bar value. 1>&2
ECHO:
GOTO usage
)
) ELSE IF "%PARAM%" == "--baz" (
SHIFT
SET BAZ=true
) ELSE IF "%PARAM%" == "" (
GOTO endargs
) ELSE (
ECHO Unrecognized option %1. 1>&2
ECHO:
GOTO usage
)
GOTO args
:endargs
ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
ECHO Baz
)
REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof
:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1
Да, это действительно плохо. См. мой аналогичный пост вhttps://stackoverflow.com/a/50653047/421049, где я предоставляю больше анализа того, что происходит в логике, и почему я использовал определенные конструкции.
отвратительно. Большую часть этого мне пришлось выучить сегодня. И это было больно.