使用逗号的意外命令行行为

时间:2013-08-30 08:08:48

标签: batch-file cmd pipe comma

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

echo a,b>a

这就像假设一样(将a,b写入名为a)的文件

echo a>a,b

是一样的!这里发生的事情在第三次测试时会更清楚:

echo a>file,b this is a test

这将创建一个名为file的文件,其中包含a,b this is a test

现在,我遇到了三个问题:

  1. 对此有何解释?如果有人问我,我会猜到逗号分隔命令或文件名,例如我希望第二个测试能够创建两个名为ab的文件。
  2. 这种行为是否记录在某处?
  3. 它是一个cmd特定的Windows扩展程序,还是因为旧的DOS时间已经这样了?

2 个答案:

答案 0 :(得分:3)

这是预期的行为,因为,;=<space><tab>是参数的分隔符 如果您将代码放入没有echo OFF的批处理文件中,您将看到

test.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

重定向后,只有下一个令牌是相关的,其余的是正常行内容的一部分 这是不重要的,其中redirction发生在一条线上 但是规则是,当同一个流存在多个重定向时,最后一个将获胜。

> file.txt echo hello> nul world > con

将在控制台上显示hello world

顺便说一下。通过插入符号(多线)重定向和线条仍然存在一种模糊的行为。

echo one two three^
 four

结果:one two three four

但是     回显一个&gt; con三^      4

结果:one two four

答案 1 :(得分:1)

逗号是批处理中的标准分隔符以及; <space> = <tab>和evertything之后将逗号作为echo的其他参数,并且只有一个参数用于重定向。您可以尝试ecnlose {{1}在引号中这应该改变输出的行为并生成a,b文件。你也可以使用a,b - ^来转义分隔符 您也可以尝试echo a>a^,b - 它将是相同的