Пакетный файл определяет, можно ли записать альтернативный поток NTFS - PullRequest
2 голосов
/ 15 февраля 2012

Фон

В 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> NUL в конце не подавляет его. Добавление 1> NUL в конец ДЕЙСТВИТЕЛЬНО подавляет его, однако оно также запрещает команде делать что-либо полезное; то есть, если вы запустите echo. > file.exe:Zone.Identifier 1>NUL, поток Zone.Identifier останется.

Как я могу успешно выполнить команду echo. > file.exe:Zone.Identifier в NTFS и подавить вывод ошибок при FAT32?

1 Ответ

4 голосов
/ 15 февраля 2012

Команда echo. > file.exe:Zone.Identifier 1>NUL вызывает перенаправление echo. на NUL, первое перенаправление игнорируется.

Добавление 2>NUL вызывает перенаправление stderr эха на NUL.Сообщение, которое вы пытаетесь избежать, выводится в stderr из-за сбоя перенаправления, а не самой командой echo.

Решение состоит в том, чтобы разделить команду на две фазы с помощью скобок:

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

Это приведет к тому, что сначала будет выполняться echo., а его вывод будет перенаправлен в альтернативный файловый поток.При попытке записи в альтернативный файловый поток при сбое файловой системы FAT его вывод в stderr будет перенаправлен в NUL.

...