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

时间:2017-09-20 13:52:10

标签: 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

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

1 个答案:

答案 0 :(得分:3)

当你跑步时(对于另一行同样)

echo 111 | (set /p readvalue= & set readvalue)

您看到控制台中显示的值为变量值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"