批处理文件传递延迟变量扩展为参数

时间:2015-06-11 15:56:19

标签: batch-file delayedvariableexpansion

我有一个批处理变量,它包含另一个变量的名称。当我对变量执行CALL ECHO时,输出就是我所期望的。但是,当我尝试将CALL ECHO命令的输出作为参数传递给另一个命令时,我遇到了问题。这就是我的尝试:

@SET myCmd=myCmd -flag1 -flag2
@SET myInnerVar=Bar
@SET myCmdArg="Value of myInnerVar is %%myInnerVar%% for this call"
:: The following correctly prints "Value of myInnerVar is Bar for this call"
@CALL ECHO %myCmdArg%
:: The following runs without passing the output as an argument to myCmd
@CALL ECHO %myCmdArg%| %myCmd%

有没有人知道如何使用延迟变量扩展来调用myCmd,就像使用参数直接调用它一样:

@myCmd -flag1 -flag2 "Value of myInnerVar is Bar for this call"

我尝试这样做的原因是我需要多次调用myCmd,其中唯一改变的是字符串" Bar"。我知道我可以使用三个变量(myCmdPre,myInnerVar和myCmdPost)来实现这一点,而不会延迟变量扩展。但是,似乎应该有另一种(更简洁的)方法来实现我的目标,而不必在每次要执行myCmd时都键入%myCmdPre%%myInnerVar%%myCmdPost%

修改

为了澄清,我在名为myCmd.bat的同一目录中写了第二个批处理文件,其中包含以下内容:

@ECHO %*

当我运行示例批处理文件时,生成的输出是:

-flag1 -flag2

就好像没有任何东西被传送到myCmd。

1 个答案:

答案 0 :(得分:1)

这是另一种做同样事情的方法

@setlocal EnableDelayedExpansion

@SET myCmd=myCmd -flag1 -flag2
@SET Foo=Bar
@SET myCmdArg="Value of Foo is ^!Foo^! for this call"
:: The following correctly prints "Value of Foo is Bar for this call"
@ECHO %myCmdArg%
:: The following runs passing the output as an argument to myCmd
@CMD /V:ON /C ECHO %myCmdArg% | %myCmd%

这里的问题是,当通过管道|执行两个进程时,管道的每一侧都会丢失当前值setlocal,因此每一侧都执行时没有延迟扩展。

编辑:以下内容也有效,不需要延迟扩展:

@SET myCmd=myCmd -flag1 -flag2
@SET Foo=Bar
@SET myCmdArg="Value of Foo is %%Foo%% for this call"
:: The following correctly prints "Value of Foo is Bar for this call"
@CALL ECHO %myCmdArg%
:: The following runs passing the output as an argument to myCmd
@CALL ECHO %myCmdArg% | %myCmd%

修改

行动!我完全混淆了问题的核心观点!如果您想传递批处理文件的变量 AS ARGUMENT 的值,为什么 PIPE IT 到批处理文件?如果-file1-file2是批处理文件的参数,并且您希望myCmdArg变量的值也是参数(第三个),然后在参数 之后输入

:: The following runs passing the value of myCmdArg variable as an argument to myCmd
@CALL %myCmd% "%myCmdArg%"