这是我的一个老问题的更新,因为我不太清楚 老实说,我甚至没有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中有类似的东西。
请告诉我发布实际命令是否更好。
谢谢伙计们,
感谢您的帮助:)
答案 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
应保存并显示结果。