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
ファイルが一つだけなのであれば、ファイルのプロパティから『ブロックの解除』をチェックすれば、簡単に ZoneId を削除することができる。
しかし、複数個のファイルの 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;
お試しあれ。
ピンバック: Linux や Windows で大量の nanaco ギフトを自動登録して、オトクに税金を支払う | Aqua Ware つぶやきブログ