it-roy-ru.com

Использование параметров в командных файлах в командной строке Windows

В Windows, как вы получаете доступ к аргументам, передаваемым при запуске командного файла?

Например, допустим, у меня есть программа с именем hello.bat. Когда я ввожу hello -a в командной строке Windows, как я могу сообщить своей программе, что -a был передан в качестве аргумента?

149
APerson

Как уже говорили другие, параметры, передаваемые через командную строку, могут быть доступны в пакетных файлах с обозначениями от %1 до %9. Есть также два других токена, которые вы можете использовать:

  • %0 - это имя исполняемого файла (пакетного файла), как указано в командной строке.
  • %* is все параметры указаны в командной строке - это очень полезно, если вы хотите переслать параметры в другую программу.

Есть также много важных методов, о которых нужно знать в дополнение к простому способу доступа к параметрам.

Проверка, был ли передан параметр

Это делается с помощью таких конструкций, как IF "%~1"=="", что истинно тогда и только тогда, когда аргументы вообще не передаются. Обратите внимание на символ тильды, который приводит к удалению любых окружающих кавычек из значения %1; без тильды вы получите неожиданные результаты, если это значение содержит двойные кавычки, включая возможность синтаксических ошибок.

Обработка более 9 аргументов (или просто облегчение жизни)

Если вам нужно получить доступ к более чем 9 аргументам, вы должны использовать команду SHIFT. Эта команда сдвигает значения всех аргументов в одно место, так что %0 принимает значение %1, %1 принимает значение %2 и т.д. %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 /? в командной строке.

270
Jon

Использование параметров в пакетных файлах:% 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 параметров для пакетного файла, используйте:% *

Маркер Percent Star %* означает "остальные параметры". Вы можете использовать цикл 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
51
Eric Leschinski

Пакетные файлы автоматически передают текст после программы, если они являются переменными для назначения их. Они передаются в порядке их отправки; например % 1 будет первой строкой, отправленной после вызова программы и т.д.

Если у вас есть Hello.bat и содержимое:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

и вы вызываете пакет в команде через

hello.bat APerson241% date%

вы должны получить это сообщение обратно:

Здравствуйте, APerson241, спасибо за запуск этого командного файла (01/11/2013)

5
rud3y

Используйте переменные, т. Е. Переменные .BAT и называемые %0 в %9

3
tohava

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

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

1
Garret Wilson