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

4

我尝试将命令输出导入变量,然后比较这些变量是否具有相同的值。但是它总是返回两个变量具有相同的值(即使并非如此)。以下是我的代码:

@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

我总是得到“是”的结果。有人知道我的错误在哪里吗?提前感谢!

1
保护你的子程序;确保每个入口点之前都有一个无条件的 goto。此外,通过尝试 echo 变量的值来进行故障排除。 - Jeff Zeitlin
尝试执行 echo 111,下一行输入 set /p readvalue= & set readvalue,再下一行输出 echo 123,再下一行输入 set /p readvaluebash= & set readvaluebash,或者简单地说,逐行执行而不是使用 echo 123 | (set....) - HackerNCoder
1个回答

10

当你运行(同样适用于另一行)时

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"

啊,我明白了!这意味着我无法在一个批处理文件中执行"%readvalue%"=="%readvaluebash%"是吗?可能最好的解决方法是先保存到 .txt 文件,我猜这样对吗? - Gregor Isack
4
@GregorIsack,这意味着您不能使用管道来更改变量并在当前批处理文件中查看更改。如果您需要将命令的输出存储在变量中,请使用for /f命令。 - MC ND
学到了新东西!非常感谢! - Gregor Isack
如何同时捕获echo 111%ERRORLEVEL% - Martin Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接