Использование параметров в пакетных файлах в командной строке 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)


использовать переменные, т. е. .BAT переменные и называется %0 to %9


@Джон :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, где я предоставляю больше анализа того, что происходит в логике, и почему я использовал определенные конструкции.

отвратительно. Большую часть этого мне пришлось выучить сегодня. И это было больно.