如何使用命令输出作为另一个命令的参数?
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
应该保存并显示结果。
这是对我的一个老问题的更新,因为我不是很清楚。
老实说,我什至没有 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
应该保存并显示结果。