![echo|set /p=foo > foo.txt 设置 %ERRORLEVEL%](https://linux22.com/image/1534266/echo%7Cset%20%2Fp%3Dfoo%20%3E%20foo.txt%20%E8%AE%BE%E7%BD%AE%20%25ERRORLEVEL%25.png)
我注意到,在尝试将文本写入文件而不使用末尾换行符时,会出现一些非常奇怪的行为。到处都有类似这样的代码:
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