2

背景

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

此属性存储为 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.

这是输出到标准输出,所以最后添加 2>NUL 不会抑制它。在末尾添加 1>NUL 会抑制它,但它也会抑制命令执行任何有用的操作;也就是说,如果您运行echo. > file.exe:Zone.Identifier 1>NUL,则Zone.Identifier流仍然存在。

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

4

1 回答 1

4

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

添加2>NUL会导致 echo 的 stderr 重定向到 NUL。您试图避免的消息通过重定向失败而不是echo命令本身打印到 stderr。

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

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

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

于 2012-02-14T23:14:04.720 回答