2

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. 对此有何解释?如果有人问我,我会猜到逗号分隔命令或文件名,例如,我预计第二个测试会创建两个名为aand的文件b
  2. 这种行为是否记录在某处?
  3. 它是一个cmd特定的 Windows 扩展,还是自 DOS 时代以来一直如此?
4

2 回答 2

3

这是预期的行为,,;=<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 一二 >con 三^四

结果:one two four

于 2013-08-30T08:17:33.887 回答
1

逗号是批处理的标准分隔符,以及; <space> = <tab>逗号作为其他参数以回显之后的所有内容,并且仅采用一个参数进行重定向。您可以尝试a,b在引号中添加,这应该会改变输出的行为并产生a,b 文件。你也可以用^-echo a>a^,b 你也可以尝试 echo a>a=b- 它会是一样的

于 2013-08-30T08:16:58.963 回答