批处理:管道命令输出到变量并比较

Gre*_*ack 3 batch-file

我尝试将命令输出通过管道传输到变量,然后比较这些变量是否具有相同的值。但是它总是返回两个变量具有相同的值(即使不是)。下面是我的代码:

@echo off
goto main

:main
setlocal

echo 111 | (set /p readvalue= & set readvalue)
echo 123 | (set /p readvaluebash= & set readvaluebash)
if "%readvalue%"=="%readvaluebash%" goto valid
if NOT "%readvalue%"=="%readvaluebash%" goto invalid

:valid
echo yes
pause
goto finish

:invalid
echo no
pause
goto finish


:finish
endlocal
Run Code Online (Sandbox Code Playgroud)

我总是得到yes结果。有人知道我的错误吗?提前致谢!

MC *_* ND 8

当你跑步时(另一条线相同)

echo 111 | (set /p readvalue= & set readvalue)
Run Code Online (Sandbox Code Playgroud)

您会看到控制台中显示为变量值的值是111,因此set /p能够检索管道数据。

问题是管道操作员启动了两个单独的cmd实例:一个运行echo管道的左侧部分 ( ),另一个运行右侧部分 ( set /p)。

由于每个进程都有自己的环境空间,并且set /p在单独的cmd实例中执行,因此对这个新实例中任何变量的任何更改cmd都不会更改cmd运行批处理文件的实例的环境。

要将命令的输出存储在变量中,您可以使用for /f命令而不是管道

for /f "delims=" %%a in ('echo 111') do set "readValue=%%a"
Run Code Online (Sandbox Code Playgroud)

  • @GregorIsack,这意味着您不能使用管道来更改变量并查看当前批处理文件中的更改。如果您需要将命令的输出存储在变量中,请使用 `for /f` 命令 (3认同)