今天,我想测试文件名是否可以包含逗号,并在打开 cmd
并尝试这三个测试时偶然发现了其他内容:
echo a,b>a
这按预期工作(将 a,b
写入名为 a
的文件)
echo a>a,b
效果是一样的!通过第三次测试,这里发生的事情变得更加清晰:
echo a>file,b this is a test
这将创建一个名为 file
的文件,其中包含 a,b 这是一个测试
。
现在,我面临三个问题:
- 对此有何解释?如果有人问我,我会猜测逗号分隔命令或文件名,例如我预计第二个测试会创建两个名为
a
和b
的文件。 - 此行为是否记录在某处?
- 它是
cmd
特定的 Windows 扩展还是自古老的 DOS 时代以来一直如此?
最佳答案
预期行为为 ,;=<space><tab>
是参数的分隔符。
如果将代码放入没有 echo OFF
的批处理文件中你会看到
测试.bat
echo a,b>a
echo a>a,b
echo a>file,b this is a test
输出
C:\temp>test.bat
C:\temp>echo a,b 1>a
C:\temp>echo a,b 1>a
C:\temp>echo a,b this is a test 1>file
重定向后,只有下一个标记是相关的,其余部分是正常行内容的一部分。
重定向发生在一行中的什么位置并不重要。
但有一条规则,当同一流存在多个重定向时,最后一个获胜。
> file.txt echo hello> nul world > con
这将导致hello world
在控制台。
顺便说一句。重定向和插入符扩展行(多行)仍然存在模糊行为。
echo one two three^
four
结果:one two three four
但是
echo one two >con three^
four
结果:one two four
关于windows - 在 Windows/DOS 批处理文件中使用逗号时出现意外的命令行行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527988/