2015/03/30

PowerShell フォルダー配下のファイルを再帰的にブロックを解除したい~Unblock-File コマンドレット


今月に入り、ASP.NET MVC 5を勉強し始めました。
サンプルをインターネットからダウンロードし、Visual Studio 2013からソリューション ファイルを実行すると当然の如くエラーになりました。
ダウンロードしたファイルは起動できないようブロックされているため解除しなけばなりませんが、ファイル数が多すぎるため手動で解除するのは面倒です。
今回は、PowerShellを使って特定のフォルダー配下のファイルを再帰的にブロックを解除する方法をメモ。
PowerShellなら、たった一行でブロックを解除できます!

ブロックを解除?

インターネットからファイルをダウンロードすると、Zone.Indentiferという代替データストリーム(副次ストリーム)が付与されます。
代替データストリームが付与された状態でファイルを実行すると警告が出たり、実行エラーになります。
実行するためには、代替データストリームをリセットする=「ブロックを解除」する必要があります。

※下記記事は、代替えストリームに関して非常に詳しく説明されています。
気になる方は是非読んでみてください。
下記画像は、実際にダウンロードしたファイルのスクリーン ショットです。
エクスプローラーの「ナビゲーションウィンドウ ペイン」の赤枠に示す全てのフォルダー配下には
ファイルは何百もあり、一つ一つにZone.Indentiferの代替データストリームが付与されています。
流石に手動でブロックを解除する気にはなれません。

フォルダー配下のファイルを再帰的にブロックを解除する

そこで、PowerShellを使ってフォルダー配下のファイルを再帰的にブロックを解除します。
ブロックを解除するためには、Unblock-File コマンドレットを使いますが、このコマンドレットだけでは無理です。
階層化されたファイルのブロックを「一度に」解除する場合は、Get-ChildItem コマンドレットの結果をUnblock-File コマンドレットに渡すパイプライン処理を行います。
これにより、たった1行でブロックが一度に解除でき、非常に便利です。そして、手動に比べ操作漏れがないため非常に安全です。
実際のサンプルは下記の通りになります。
$p = "c:\users\<ユーザー名>\Downloads\xxxx"

Get-ChildItem "$p\*.*" -Recurse | Unblock-File 
上記スクリプトで最も大切な点は、Get-ChildItem コマンドレットに-Recurse オプションを付与する事です。
このオプションを付与する事で、対象フォルダー配下の要素を再帰的にブロックを解除します。

手動で解除していた方は是非、PowerShellを使ってブロックを解除し、面倒な作業を楽にしてください。
余談:PowerShell 3.0以上の環境で使えます
Unblock-File コマンドレットはPowerShell 3.0以上の環境で使えます。
もし、Windows 7を使っている場合は注意が必要です。
初期状態のWindows 7のPowerShellはバージョン 2.0なため、Unblock-File コマンドレットは使えません。
その場合は、Windows Management Framework 4.0等へアップグレードが必要です。
アップグレード方法は下記記事で説明しています。
Windows Management Frameworkについて~おさらいとWMF 4.0へアップグレード
スポンサーリンク

スポンサーリンク