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

Batch File Pass Delayed Variable Expansion As Argument

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

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

@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 变量的值也是 参数 (第三个),然后把它放在 之后 -file1 和 file2 arguments:

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