![使用 Unix 行尾编写批处理文件是否安全?](https://linux22.com/image/596243/%E4%BD%BF%E7%94%A8%20Unix%20%E8%A1%8C%E5%B0%BE%E7%BC%96%E5%86%99%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AE%89%E5%85%A8%EF%BC%9F.png)
我认为我在批处理文件中遇到了一个错误,因为它是用 unix 行尾编写的。这是 cmd.exe 在 Windows 中运行批处理文件的已知问题吗?
答案1
这实际上不是一个“错误”……因为它是设计使然。Windows 换行符定义为“\r\n”……或“回车符”和“换行符”的组合……而 *nix 版本则倾向于省略回车符。在 Windows 中,您应该尽可能使用“\r\n”。其他任何内容都可能被错误解释……并导致大量意外结果。
答案2
它似乎那批标签LF
当文件中使用 (Unix 行结束)时将被跳过.bat
。
答案3
对于批处理文件,unix 行尾和 windows 行尾之间没有太大区别。
目前,在搜索标签时,GOTO 和 CALL 的行为只存在一个已知故障。如果标签位于相对于当前文件位置的 512 字节边界上,则标签解析器无法找到标签。不同之处在于,因为回车符用于内部线路重置。请参阅当批处理文件具有 Unix 行结尾时,Call 和 goto 可能会失败
尽管使用了标签扫描器,但意外地发现了更多问题,因为批处理解析器在百分比扩展阶段之后直接删除了所有回车符。
示例显示问题:
@echo off
goto :main
:func
echo ************************************************
echo ************************************************
echo ************************************************
echo ************************************************
echo ************************************************
echo ***********************************************
echo ***********************************************
echo ***********************************************
echo ************************************************
echo never go back to :main
echo This is the end of :func
exit /b
:main
:main
echo This is main
goto :func
exit /b
输出为
这是 :func 的结尾
答案4
答案是:您可能会“幸运”地使用 LF,但不要指望它。我们遇到了与原始请求者相同的问题。我们的流程最终会得到只有 LF 的 bat 文件,并且(抱歉找不到模式)有时会显示“未找到”标签,尽管它显然在那里。必须转换为 CR-LF,或进行随机更改,直到它起作用!