ZoneId を PowerShell を使って一括削除 [v3 以上]


Windows では、リモートからダウンロードしたファイルに、 “ZoneId” という物が付加される。
このID が付加されたファイルは、 exe として 実行する際にセキュリティ警告が表示されたり、 .NET アセンブリ dll として PowerShell に読み込む際に、

Add-Type : ファイルまたはアセンブリ 'file:///*.dll'、またはその依存関係の 1 つが読み込めませんでした。操作はサポートされません。 (HRESULT からの例外: 0x80131515)
発生場所 行:1 文字:1
+ Add-Type -Path 'C:\*.dll'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-Type], FileLoadException
    + FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand

などとエラーになってしまう。
160925_1

ファイルが一つだけなのであれば、ファイルのプロパティから『ブロックの解除』をチェックすれば、簡単に ZoneId を削除することができる。
160925_2
しかし、複数個のファイルの ZoneId を一回の操作で同じように削除することができないため、 ZoneId を削除したいファイルが大量にある場合はなかなかウザい。

PowerShell v3 以上を使えば、この ZoneId 削除をいとも簡単に行うことができるので、紹介しよう。

ZoneID は、 NTFS の 代替データストリーム というところに設定されてる。
PowerShell v3 以上であれば、 Get-Item / Remove-Item コマンドレットを使って、 この 代替データストリーム 取得、削除を行える。

ダウンロードしたファイル一つだけ ZoneId を削除したいのであれば、

Remove-Item 'ファイルパス' -Stream Zone.Identifier;

とすれば、 ZoneID をきれいさっぱり削除することができる。

カレントフォルダ以下の ZoneID が設定されたすべてのファイルから ZoneID を削除したいのであれば、以下のようなコマンドでできる。

Get-ChildItem -Recurse -File | ?{
  $_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
} | Remove-Item -Stream Zone.Identifier;

手動で選択したいくつかのファイルの ZoneID 削除を一括で行いたいのであれば、 PowerShell で追加された Get-Clipboard と組み合わせることで、さらに手軽に ZoneID を一括削除できる。
一旦エクスプローラー上で ZoneId を削除したいファイルのコピー操作を行った後、次のコマンド1行実行するだけだ。

Get-Clipboard -Format FileDropList | Remove-Item -Stream Zone.Identifier;

お試しあれ。

コメントを残す

メールアドレスが公開されることはありません。