1

我有一个批处理变量,其中包含另一个变量的名称。当我CALL ECHO对变量执行 a 时,输出是我所期望的。但是,当我尝试将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)来做到这一点,而不会延迟变量扩展。但是,似乎应该有另一种(更简洁)的方式来实现我的目标,而不必%myCmdPre%%myInnerVar%%myCmdPost%每次我想执行 myCmd 时都输入。

编辑

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

@ECHO %*

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

-flag1 -flag2

好像没有任何东西通过管道传输到 myCmd。

4

1 回答 1

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%

编辑

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

:: The following runs passing the value of myCmdArg variable as an argument to myCmd
@CALL %myCmd% "%myCmdArg%"
于 2015-06-11T16:16:21.130 回答