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

How To Use A Command Output As An Argument of Another Command?

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

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

例如:-

CLITool -Switch (Value_OF_a_Command_OutPut)

我想我这里需要的是Set命令:-

Set Value=
         Command

CLITool -Switch %Value%

但是,问题是输出值会打印 Line_Break!

OutPut_Value
CLITool -Switch (Nothing!)

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

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

顺便说一句..大多数 Linux 用户都知道,可以在另一个命令的同一命令行中使用命令输出,如下所示:

CLITool -Switch $(Command)

我希望 windows CLI 中是否有类似的东西。

请告诉我 post 我的实际命令是否更好。


谢谢大家,
感谢您的帮助:)

您可以使用 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 (/q) 将执行所需的命令。

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

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

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

应该保存并显示结果。