我想使用传递给批处理文件的前2个参数,然后将其他所有内容附加到批处理文件中执行的命令。
有一种简单的方法吗?
// batch file
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line}
批处理将像这样执行
batch.bat USR PWD -Dargument1=1 -Dargument2=2
实际上,我希望执行以下内容
command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2
答案 0 :(得分:3)
for
命令可以为您提供所需内容:
for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c
来自for
(for /?
)的帮助:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
将解析myfile.txt中的每一行,忽略以。开头的行
一个分号,将第2和第3个标记从每一行传递给for
正文,用逗号和/或空格分隔的标记。 注意到
body语句引用%i来获取第二个标记,%j来获取
第三个令牌,%k在第三个令牌后获得所有剩余的令牌。 For
包含空格的文件名,您需要引用文件名
双引号。为了以这种方式使用双引号,你也是
需要使用usebackq选项,否则双引号将是
解释为定义要解析的文字字符串。
所以在我的解决方案中,%%a
具有传递给脚本的第一个参数的值,%%b
第二个参数的值,以及%%c
剩余的参数。
当我从命令提示符运行batch.bat USR PWD -Dargument1=1 -Dargument2=2
时,我得到:
command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2
删除echo
之后的do
以使用参数调用命令。
答案 1 :(得分:2)
Patrick Cuff的解决方案通常有效,但如果前两个参数中的任何一个包含引号空格或特殊字符,它将失败。如果参数用空格以外的其他内容分隔,它也将失败。 FOR / F分隔符可以扩展为包含,
;
和=
,但如果参数包含任何引用的分隔符,它将失败。
以下改进支持引用的特殊字符,如&
和|
,但参数分隔符仍然存在问题。
@echo off
setlocal enableDelayedExpansion
set args=%*
for /f "tokens=1,2*" %%a in ("!args!") do (
endlocal
echo arg1=%%a arg2=%%b remainder=%%c
)
编辑 以下是使用USEBACKQ进行更简单的修改
for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a arg2=%%b remainder=%%c
结束编辑
不幸的是,一个真正通用的解决方案需要一个GOTO循环来解析3上的每个参数。只要所有报价均衡并且引用所有特殊字符,下面的解决方案就应该有效。
@echo off
setlocal
set "args="
:parseArgs
set args=%args% %3
shift /3
if "%~3" neq "" goto :parseArgs
if (%3) equ ("") goto :parseArgs
echo arg1=%1 arg2=%2 remainder=%args%
要消除所有限制,需要采取严厉措施 - 请参阅How to receive even the strangest command line parameters?
答案 2 :(得分:1)
这可能就是你想要的
C:>help shift
Changes the position of replaceable parameters in a batch file.
SHIFT [/n]
If Command Extensions are enabled the SHIFT command supports
the /n switch which tells the command to start shifting at the
nth argument, where n may be between zero and eight. For example:
SHIFT /2
would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected.