windows - 在 Windows/DOS 批处理文件中使用逗号时出现意外的命令行行为

标签 windows batch-file cmd dos

今天,我想测试文件名是否可以包含逗号,并在打开 cmd 并尝试这三个测试时偶然发现了其他内容:

echo a,b>a

这按预期工作(将 a,b 写入名为 a 的文件)

echo a>a,b

效果是一样的!通过第三次测试,这里发生的事情变得更加清晰:

echo a>file,b this is a test

这将创建一个名为 file 的文件,其中包含 a,b 这是一个测试

现在,我面临三个问题:

  1. 对此有何解释?如果有人问我,我会猜测逗号分隔命令或文件名,例如我预计第二个测试会创建两个名为 ab 的文件。
  2. 此行为是否记录在某处?
  3. 它是 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/

相关文章:

windows - 如何使用批处理脚本更改clearcase_albd 帐户域名和密码?

windows - 使用 COPY 命令合并文件并获取奇数字符

android - 如何在 Windows 中通过命令行取消签名 APK

windows - 我可以在 Azure 上使用 %PUBLIC% 和其他 "special"文件夹吗?

java - 如何为作为 Windows 服务运行的 Java 应用程序设置代理

batch-file - 使用 npm install 命令创建 .bat 文件

windows - 如何使用 Windows 命令行环境查找和替换文件中的文本?

Python ctypes 和没有足够的参数(缺少 4 个字节)

转换 Unix 行结尾的 Windows 命令?

windows - 如果大于批处理文件