echo|set /p=foo > foo.txt 设置 %ERRORLEVEL%

echo|set /p=foo > foo.txt 设置 %ERRORLEVEL%

我注意到,在尝试将文本写入文件而不使用末尾换行符时,会出现一些非常奇怪的行为。到处都有类似这样的代码:

echo|set /p=foo > foo.txt

它运行得很好,但是我的构建系统失败了,因为当我评估 %ERRORLEVEL% 时,我在调用后得到了 1:

echo %ERRORLEVEL%
echo |set /p=foo>foo.txt
echo %ERRORLEVEL%

返回

D:\>echo 0
0

D:\>echo   | set /p=foo  1>foo.txt

D:\>echo 1
1

这是已知行为吗?是set因为没有变量可设置而变得挑剔吗?

笔记:回显的代码echo |set /p=foo>foo.txt实际上是echo | set /p=foo 1>foo.txt

答案1

感谢@Regejok 的提示。set不过搜索并不是最简单的任务 :D

然而引用这个来源:https://ss64.com/nt/set.html看来这确实导致错误级别被设置为 1:

错误级别

    当启用 CMD 命令扩展时(默认)

    如果变量成功更改,则 %ERRORLEVEL% = 0
    未找到变量/名称无效 = 1
    SET /A 不平衡括号 = 1073750988
    SET /A 缺少操作数 = 1073750989
    SET /A 语法错误 = 1073750990
    SET /A 无效数字 = 1073750991
    SET /A 大于 32 位的数字 = 1073750992
    SET /A 除以零 = 1073750993

答案2

刚刚偶然发现了同样的问题。

在对该命令进行一些操作后,set /p我发现在两种情况下它会上升 %ERRORLEVEL%:当没有变量名时,以及当用户输入为空时。

我使用技巧从字符串中去除引号,并且对我来说提供一个虚拟变量名就足以修复:

$ echo | set /p DUMMY="Some string with spaces and quotes" > log.txt

然后检查它是否确实有效:

$ echo %ERRORLEVEL%
0
$ type log.txt
Some string with spaces and quotes

相关内容