在Windows命令行中使用批处理文件中的参数

APe*_*son 155 windows parameters arguments cmd batch-file

在Windows中,如何访问运行批处理文件时传递的参数?

例如,假设我有一个名为的程序hello.bat.当我进入hello -aWindows命令行时,如何让我的程序知道-a作为参数传递?

Jon*_*Jon 278

正如其他人已经说过,可以通过命令行传递的参数可以在批处理文件访问与符号%1%9.您还可以使用另外两个令牌:

  • %0命令行中指定的可执行(批处理文件)名称.
  • %*命令行中指定的所有参数 - 如果要将参数转发到另一个程序,这非常有用.

除了如何访问参数之外,还有许多重要的技术需要注意.

检查参数是否已通过

这是通过类似的结构来完成的,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!
Run Code Online (Sandbox Code Playgroud)

此方案允许您解析相当复杂的命令行而不会疯狂.

替换批处理参数

对于表示文件名的参数,shell提供了许多与处理无法以任何其他方式访问的文件相关的功能.使用以#开头的结构访问此功能%~.

例如,要获取作为参数使用传入的文件的大小

ECHO %~z1
Run Code Online (Sandbox Code Playgroud)

要获取启动批处理文件的目录的路径(非常有用!),您可以使用

ECHO %~dp0
Run Code Online (Sandbox Code Playgroud)

您可以通过CALL /?在命令提示符下键入来查看所有这些功能.

  • :解析,:endparse构造是美,即使是GOTO.谢谢!(我的意思是,DOS-BASIC强制GOTO) (4认同)

Eri*_*ski 54

使用批处理文件中的参数:%0和%9

批处理文件可以引用作为参数传入的单词,使用标记:%0to %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.
Run Code Online (Sandbox Code Playgroud)

在命令行上传入的参数必须是字母数字字符,并用空格分隔.因为%0它是被调用的程序名,所以%0如果在启动时启动,在DOS中将为AUTOEXEC.BAT为空.

例:

将以下命令放在名为的批处理文件中mybatch.bat:

@echo off
@echo hello %1 %2
pause
Run Code Online (Sandbox Code Playgroud)

像这样调用批处理文件:mybatch john billy将输出:

hello john billy
Run Code Online (Sandbox Code Playgroud)

获取批处理文件的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
Run Code Online (Sandbox Code Playgroud)


Gar*_*son 8

@Jon 的:parse/:endparse方案是一个很好的开始,他对最初的通过表示感谢,但是如果您认为 Windows 折磨人的批处理系统会让您那么轻松……好吧,我的朋友,您会感到震惊。我花了一整天的时间在这个恶魔身上,经过大量痛苦的研究和实验,我终于设法实现了一些可用于现实生活的实用程序。

假设我们要实现一个实用程序foobar。它需要一个初始命令。它有一个可选参数--foo,它接受一个可选值(当然不能是另一个参数);如果缺少该值,则默认为default. 它还有一个可选参数--bar,它需要一个必需的值。最后,它可以带一个--baz没有允许值的标志。哦,这些参数可以按任何顺序出现。

换句话说,它看起来像这样:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]
Run Code Online (Sandbox Code Playgroud)

复杂的?不,这似乎是现实生活中的公用事业的典型代表。(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
Run Code Online (Sandbox Code Playgroud)

是的,真的很糟糕。请参阅我在/sf/answers/3545713321/ 上的类似帖子,在那里我提供了对逻辑中发生的事情的更多分析,以及我使用某些结构的原因。

可怕。我今天必须学习其中的大部分内容。而且很痛。


rud*_*d3y 5

批处理文件会自动在程序之后传递文本,只要它们是要分配给它们的变量即可.它们被传递以便发送; 例如%1将是调用程序后发送的第一个字符串,等等.

如果你有Hello.bat,内容是:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause
Run Code Online (Sandbox Code Playgroud)

并通过命令调用批处理

hello.bat APerson241%date%

你应该收到这封邮件:

您好,APerson241感谢您运行此批处理文件(01/11/2013)