2010年1月23日土曜日

PowerShellでファイルを圧縮!(zipファイル)

システムの運用をしていく中で、
ファイルを圧縮して保存することは、よくある話です。
ログファイルなんかは結構小さくなりますしね。

PowerShell Community Extensionsで提供されるコマンドレットに、
Zipファイルを作成するコマンドレットが含まれますので、
これを使うのが一番簡単じゃないかと思います。

が、この手のモノを使っちゃいけないような場合についても、
Comオブジェクトを使用してさっくりと実装することが可能です。

実装例:
Zipファイルを作成します。
Zipファイルの直下に同一名称のアイテムを配置しようとすると
ポップアップウィンドウが出て困るので、
重複した場合には処理を中止し、zipファイルも消します。

# Zip-Item.ps1
$ZipFilePath = "D:\testzip.zip" # zipファイル作成先
$TargetItems = "D:\test","D:\*.rb" # 圧縮対象ファイルとかフォルダとか

# Zipファイル作成(同一名称ファイルが存在する場合には予め削除する)
if(Test-Path -Path $ZipFilePath)
{
Remove-Item -Path $ZipFilePath
}
([char]80 + [char]75 + [char]5 + [char]6).ToString() + ([char]0).ToString()*18 | `
New-Item -Path $ZipFilePath -Type File

# Zipファイルにファイルおよびフォルダを投入
$shell = New-Object -com Shell.Application
$zipfile = $shell.NameSpace($ZipFilePath)
$archivedItems = New-Object Collections.ArrayList
foreach($item in ($TargetItems | %{Get-Item -Path $_}))
{
# 同一名称のアイテムが存在した場合、zipファイルを削除して例外をスロー
foreach($archivedItem in $archivedItems)
{
if($item.Name -eq $archivedItem.Name)
{
Remove-Item -Path $ZipFilePath
throw "ファイル名またはフォルダ名が重複しています:" `
+ $archivedItem.FullName + "," + $item.FullName
}
}

# ファイルまたはフォルダをZipファイルに投入。圧縮処理は非同期なので、その終了を待つ。
$archivedItems.Add($item) | Out-Null
$zipfile.CopyHere($item.FullName)
while($true)
{
if($archivedItems.Count -eq $zipfile.Items().Count)
{
break
}
Start-Sleep -Seconds 1
}
}
return $archivedItems.ToArray()


参考サイト:
Jeans & Development : VBScript での zip ファイルの作成

修正履歴:
2010/1/28 サンプルコードのコメントを緑色にしてみた。

0 件のコメント: