如何使用命令输出作为另一个命令的参数?

时间:2015-01-16 18:01:17

标签: windows batch-file command-line set

这是我的一个老问题的更新,因为我不太清楚 老实说,我甚至没有Win_CLI经验来提出正确的问题。所以我很抱歉,我希望这次更好。

就像我在我的问题中所说,我需要使用命令输出作为另一个命令的参数。

例如: -

CLITool -Switch (Value_OF_a_Command_OutPut)

我认为我需要的是Set命令: -

Set Value=
         Command

CLITool -Switch %Value%

但问题是输出值将使用Line_Break打印!

OutPut_Value
CLITool -Switch (Nothing!)

因此,命令无法正确执行。

所以..我现在的问题是,如何修复Set命令问题,
如果可能的话,如何在另一种技术中做同样的事情?

BTW ..正如大多数Linux用户所知,可以在另一个命令的同一命令行中使用命令输出,如下所示:

CLITool -Switch $(Command)

我希望在Windows CLI中有类似的东西。

请告诉我发布实际命令是否更好。


谢谢伙计们,
感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

您可以使用for /f命令。对于执行命令输出中的每一行,将执行do子句中的代码,该行的内容存储在for可替换参数

 for /f "delims=" %%a in ('command') do CLITool -Switch %%a

此外,您可以执行命令,将输出发送到临时文件并使用输入重定向和set /p命令检索其内容

command > "tempfile"
<"tempFile" set /p "var="
CLITool -Switch %var%

在这两种情况下,假设command只回显一行。如果它生成更多行,for将为每行执行CLITool,而重定向选项将仅从临时文件中检索第一行。

解决问题的第三种方法是使用管道。管道的左侧生成内容,右侧读取此内容。

command | ( set /p "var=" && @call CLITool -Switch %%var%% )

为什么call%%var%%语法?我们在一行内设置一个变量,在同一行中我们需要检索变量,为此,需要延迟扩展。但默认情况下,延迟扩展被禁用并且启用它并不能解决任何问题,因为管道的每一侧都在其自己的cmd实例内执行,该实例在没有延迟扩展(默认行为)的情况下启动,因此,诀窍是逃避引用到变量(百分号加倍的原因)并强制在行中进行双重解析阶段(call的原因)

替代方案可能是

command | cmd /e /v /q /c "set /p "var=" && CLITool -Switch !var!"

通过这种方式,我们在pipt的右侧运行了一个cmd实例,启用了延迟扩展(/v),启用了扩展程序(/e),echo off({{1将执行所需命令。

但管道代码(在两种情况下)都有一个缺点:变量是在单独的cmd实例中设置的,因此,您的主批处理文件将无法访问其值。

答案 1 :(得分:1)

如果您从可执行文件返回两行并希望将每个行分配给变量,则

set "line1="&set "line2="
for /f "delims=" %%a in ('yourcommand') do if defined line1 (set "line2=%%a") else (set "line1=%%a")
set line

应保存并显示结果。