がらくた置き場

がらくただけど、心を込めて。

NTFSファイルのZoneID削除スクリプト

Zone IDがうざい

インターネットから拾ってきたファイルでは、NTFSの代替データストリーム(Alternate Data Stream)にZone.Identifierてのがくっ付いてくる時がある。
これをエクスプローラとかで解凍すると引き続きZoneIDがくっついて、プログラムを実行する際の邪魔になったりするので、削除するためのスクリプトをメモっておきます。

解除にあたっては7-Zipとかで圧縮、展開して代替データストリームを消してしまうって手段が一番説明が楽なのですが、バッチやスクリプトを使える人ならこっちのが簡単。

使い方

後述するスクリプトを拡張子PS1で保存して、ZoneIDを消したいディレクトリに置いて実行するだけ。

※ PS1スクリプトを初めて実行する環境では要確認&設定。
あらかじめ管理者権限でPowerShellを実行して
「Get-ExecutionPolicy」
を実行して、Restricted(制限)と出る場合はさらに
「Set-ExecutionPolicy RemoteSigned」を実行して制限を解除する。

スクリプト本体

# スクリプトが問答無用で止まる場合は「Get-ExecutionPolicy」で権限を確認してください。
# 結果が「Restricted」の場合は「RemoteSigned」に変更すること。
# あらかじめ管理者権限で「Set-ExecutionPolicy RemoteSigned」を実行する。

# 管理者権限に昇格
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }

# スクリプトファイルのあるディレクトリを取得
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

# カレントディレクトリをスクリプトのあるディレクトリに変更
Set-Location -Path $scriptPath

# カレントディレクトリを変数に格納
$currentDirectory = Get-Location

# カレントディレクトリと、これから実行するスクリプトを表示。
Write-Host "現在のディレクトリ: $currentDirectory"
Write-Host "Get-ChildItem $currentDirectory -Recurse | Unblock-File を実行しますか?"
Write-Host "続行すると開始します。(※ 作業の経過表示はありません)"
pause
Write-Host ""

# カレントディレクトリとそのサブディレクトリのすべてのファイルに対してブロック解除を実行
Write-Host "Get-ChildItem $currentDirectory -Recurse | Unblock-File を実行中"
Get-ChildItem $currentDirectory -Recurse | Unblock-File
Write-Host ""

# 処理完了のメッセージ
Write-Host "ブロック解除が完了しました。"
Write-Host "続行するとウィンドウが閉じます。"
pause

以上、参考になれば幸いデス。