在Windows命令行中使用batch file中的参数
在Windows中,如何访问batch file运行时传递的参数?
例如,假设我有一个名为hello.bat
的程序。 当我在Windows命令行中inputhello -a
时,如何让程序知道-a
作为参数传入?
正如其他人已经说过的那样,通过命令行传递的参数可以用符号%1
到%9
batch 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,即.BAT
variables,并调用%0
到%9