我有一个批处理变量,它包含另一个变量的名称。当我对变量执行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。
答案 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%"