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

Batch file 批处理文件传递延迟变量扩展作为参数,batch-file,delayedvariableexpansion,Batch File,Delayedvariableexpansion,我有一个批处理变量,它包含另一个变量的名称。当我对变量执行调用ECHO时,输出就是我所期望的。但是,当我尝试将callecho命令的输出作为另一个命令的参数进行管道传输时,我遇到了一些问题。这就是我正在尝试的: @SET myCmd=myCmd -flag1 -flag2 @SET myInnerVar=Bar @SET myCmdArg="Value of myInnerVar is %%myInnerVar%% for this call" :: The following correctl

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

@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。

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

@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%
编辑

行动!我完全混淆了问题的核心!如果要将变量的值作为批处理文件的参数传递,为什么要将其通过管道传递到批处理文件?如果批处理文件的参数是
-file1
-file2
,并且希望
myCmdArg
变量的值也是参数(第三个),则只需将其放在-file1和file2参数之后即可:


@CMD/V:ON/C呼叫ECHO!myCmdArg!|%myCmd%
我将两个建议的解决方案复制/粘贴到我的批处理文件(逐字),它们都在第一行输出
“此调用的Foo is Bar值”
,在第二行输出
-flag1-flag2
(在我编辑的问题中使用我对“myCmd.bat”的实现)。您是否在您的机器上看到不同的结果?我正在使用Win 7 Ultimate SP1 x64。请参阅我答案中的第二个编辑。。批处理文件的参数不会通过管道传输到它!哇,我觉得自己像个白痴吗。这非常简单,不需要延迟变量展开。对于其他人来说,最终的编辑是有效的解决方案。
:: The following runs passing the value of myCmdArg variable as an argument to myCmd
@CALL %myCmd% "%myCmdArg%"