批处理文件检测是否可以写入NTFS备用流

时间:2012-02-14 21:38:09

标签: windows-7 batch-file cmd ntfs fat32

背景

在Windows 7中,当从互联网上下载文件时,某些浏览器(例如IE和Firefox)会将其标记为来自互联网。这在文件的属性对话框中很明显,它会在属性窗口的底部显示一条消息和一个“取消阻止”按钮。

此属性作为备用流存储在NTFS文件系统上 - 特别是名为“Zone.Identifier”的流。因此,在被阻止的文件上,您可以运行命令more < file.exe:Zone.Identifier并获得输出:

[ZoneTransfer]
ZoneId=3

您可以使用命令echo. > file.exe:Zone.Identifier清除此数据。这只是一个空白行覆盖上面的数据,虽然Zone.Identifier流仍然存在于文件中,但文件不再被“阻止”,如属性对话框所确认的那样。

问题

FAT32文件系统显然没有NTFS备用流;所以,命令echo. > file.exe:Zone.Identifier给出输出:

The filename, directory name, or volume label syntax is incorrect.

这是输出到stdout,因此在末尾添加2&gt; NUL不会抑制它。将1> NUL添加到末尾DOES会抑制它,但是它也会阻止命令执行任何有用的操作;也就是说,如果您运行echo. > file.exe:Zone.Identifier 1>NUL,则Zone.Identifier流仍然存在。

如何在NTFS上成功运行命令echo. > file.exe:Zone.Identifier,并在FAT32上抑制其错误输出?

1 个答案:

答案 0 :(得分:4)

命令echo. > file.exe:Zone.Identifier 1>NUL导致echo.重定向到NUL,忽略第一个重定向。

添加2>NUL会导致echo的stderr重定向到NUL。您尝试避免的消息将通过失败的重定向打印到stderr,而不是由echo命令单独打印。

解决方案是使用括号将命令分为两个阶段:

(echo. > file.exe:Zone.Identifier) 2>NUL

这将导致首先执行echo.,并将其输出重定向到备用文件流。如果尝试写入FAT文件系统上的替代文件流,那么它输出到stderr将被重定向到NUL。