在Windows命令行中使用batch file中的参数

在Windows中,如何访问batch file运行时传递的参数?

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

正如其他人已经说过的那样,通过命令行传递的参数可以用符号%1%9batch file访问。 还有另外两个令牌可以使用:

  • %0命令行中指定的可执行文件(batch file)的名称
  • %*在命令行中指定的所有参数 – 如果要将这些参数转发给另一个程序,这非常有用。

除了简单的如何访问参数之外,还有很多重要的技术需要注意。

检查是否传递了一个参数

这是通过像IF "%~1"==""这样的构造来完成的,当且仅当没有参数被传递时才是如此。 请注意,导致任何周围的引号从%1的值中删除的代字符字符; 如果该值包含双引号(包括语法错误的可能性),您将得到意想不到的结果。

处理超过9个参数(或者简化生活)

如果你需要访问9个以上的参数,你必须使用SHIFT命令。 这个命令把所有参数的值移到一个地方,所以%0%1的值, %1%2的值,等等。 %9取第十个参数的值(如果存在的话)在调用SHIFT之前不能通过任何variables获得(input命令SHIFT /?获取更多选项)。

当您想要轻松处理参数而不要求以特定顺序显示参数时, SHIFT也很有用。 例如,脚本可以以任何顺序识别标志-a-b 。 在这种情况下parsing命令行的一个好方法是

 :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! 

这个scheme允许你parsing相当复杂的命令行,而不会发疯。

批次参数的replace

对于表示文件名的参数,shell提供了许多与处理无法以其他方式访问的文件相关的function。 这个function可以用以%~开头的结构来访问。

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

 ECHO %~z1 

要获取batch file的启动目录的path(非常有用!),可以使用

 ECHO %~dp0 

您可以通过键入CALL /?来查看全部functionCALL /? 在命令提示符下。

使用batch file中的参数:%0和%9

batch file可以引用以令牌forms传递的参数: %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的batch file中:

 @echo off @echo hello %1 %2 pause 

像这样调用batch file: mybatch john billy会输出:

 hello john billy 

获取超过9个batch file的参数,使用:%*

百分比星标记%*表示“其余参数”。 您可以使用for循环来抓取它们,如下所示:

http://www.robvanderwoude.com/parameters.php

有关批处理参数的分隔符的注意事项

命令行参数中的某些字符被batch file忽略,具体取决于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 

batch file自动传递文本后的文本,只要他们是variables分配给他们。 他们被传递,以便他们被发送; 例如,%1将是程序被调用后发送的第一个string,等等。

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

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

并通过调用批处理命令

hello.bat APerson241%date%

你应该收到这个消息:

您好,APerson241感谢您运行这个batch file(01/11/2013)

使用variables,即.BATvariables,并调用%0%9