奇怪的stdout重定向行为

时间:2014-04-29 05:11:35

标签: windows file batch-file cmd ntfs

我注意到在将stdout重定向到名称为'的特殊字符的文件时出现了一些奇怪的行为。

我发现的那些:

echo.>f,test生成一个名为f的文件,其中包含文字,test。与.;<space>相同(显然,逗号会更改为任何字符)。

echo.>f.:test生成一个名为F~000%HK的零字节文件。输出文件名中的第一个字符对应于重定向&#39;文件名&#39;在重定向字符和.:大写之间(我相信.被忽略/删除,原因与尝试创建名为f....的文件的原因相同,只创建一个名为f的文件。我不知道其余的意思是什么,因为在文件名后更改文字&#39;一无所获。即echo.>f.:nope仍然生成空文件F~000%HK

同一件事的另一个例子; echo.>test.:test生成一个名为TEST~4N5的零字节文件。

在批处理中,后一个示例产生了具有奇怪名称的空文件的相同结果,但前一个示例生成了一个名为f的文件,其中包含一个空行。

任何解释/&#39;异常&#39;添加?

1 个答案:

答案 0 :(得分:3)

, ; = <space> <tab>是标准分隔符,因此echo.>f,testecho. ,test>f相同。您可以在打开echo的批处理批处理文件中查看此案例中的实际情况。(在重定向之前只设置echo on)。重定向语法可能很棘手,因为文件只需要第一个参数,并且prio高于命令。您可以使用echo. >"f,test"

更改结果

至于echo.>test.:test - 您正在重定向到Alternate data streams(您使用的是FAT32还是NTFS.FAT32不支持ADS,结果可能会产生不同的结果)?使用dir /r(r开关可从vista及以上版本获得)或streams.exe from sysinternals,您可以检查ADS的状态。要查看ADS内容,您可以使用更多命令:

more<test.:test

以下是我知道的可以读取ADS的命令:FOR /F , FIND , FINDSTR ,MORE , CERTUTIL ,CLIP ,EXPAND , SORT , MOFCOMP , FTP -S , CSCRIPT , WSCRIPT

记事本和写字板会在打开包含ADS的文件时删除ADS。