cmc*_*nty 16 windows batch-file
我想我在批处理文件中遇到了一个错误,因为它是用 unix 行结尾编写的。这是 cmd.exe 在 Windows 中运行批处理文件的已知问题吗?
The*_*Wiz 12
这真的不是一个“错误”......因为它是设计使然。Windows 换行符定义为“\r\n”...或“回车”和“换行”组合...而 *nix 风格更喜欢省略回车。在可能的情况下,您应该始终在 Windows 中的任何内容中使用“\r\n”。其他任何事情都可能被错误地解释……并导致大量意想不到的结果。
对于批处理文件,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
Run Code Online (Sandbox Code Playgroud)
输出是
这是 :func 的结尾
你必须是一个偏执狂并且
@echo off
goto main <- No use of colon
...
:main
:main <- Repeat label
echo At least one of the above labels are discoverable
REM main part done <- No use of colons in comments
Run Code Online (Sandbox Code Playgroud)
当使用 Unix 行结尾时,标签解析器将由于差一错误而跳过一些标签。这是由于解析器使用 512 字节大小的块,并且假设行结尾由两个字符 表示,\r\n而不是一个字符 表示\n。当一个标签被错误地跳过时,下一个错误的跳过只能发生在偏移量为 512 字节的地方。如果您在下一行复制标签,则重复的标签将在 512 限制之内,并且可以充当后备。
此外,正如 @jeb 所演示的,解析器还将每个 512 字节大小的块的末尾误解为新行(以及以某种方式忽略冒号和这些伪行上的下一个文本之间的空白字符)。诸如此类的注释:: main section可以触发解析器以某种方式将文本读取: main为标签:main。
总之,解析器不仅可以跳过标签,还可以将注释和其他文本片段误解为标签。
假设批处理脚本将保留其行结尾并不总是安全的,尤其是在使用 Git 或通过 GitHub 共享内容时。对于跨平台项目来说,不关心行结束符并假设 Unix 行结束符作为共同点也很方便。
| 归档时间: |
|
| 查看次数: |
3791 次 |
| 最近记录: |