zipの中にフォルダが含まれているのではなく、大量のフォルダの中に大量のzipが含まれている案件に遭遇し、解凍処理を自動化した。
すなわちこのような状態のzipをそのままフォルダ階層を維持したままそのまま解凍する。
フォルダ1
フォルダ1 -a.zip,b.zip,c.zip ...
フォルダ2 -a.zip,b.zip,c.zip ...
フォルダ3 -a.zip,b.zip,c.zip ...
フォルダ2
フォルダ1 -a.zip,b.zip,c.zip ...
フォルダ2 -a.zip,b.zip,c.zip ...
フォルダ3 -a.zip,b.zip,c.zip ...
フォルダ3
フォルダ1 -a.zip,b.zip,c.zip ...
フォルダ2 -a.zip,b.zip,c.zip ...
フォルダ3 -a.zip,b.zip,c.zip ...
にて書かれているコードを改良した。
Expand-Archive
の- LiteralPath
をつけるのがポイント。[]
があるとフォルダが存在するのに存在しないことになってしまうで、このオプションでパスを指定する。
このps1を展開したいフォルダがあるフォルダの直下に置くとps1と同じディレクトリ以下のフォルダをダイアログで指定したフォルダーに展開する。
powershell unzip.ps1
$basedir = Convert-Path .;
Write-Host "Search zip files..."
$zipfiles = Get-ChildItem $basedir -Recurse | Where-Object {$_.Extension -eq ".zip"}
Write-Host "Ask unzip foloder..."
Add-Type -AssemblyName System.Windows.Forms
$FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{
RootFolder = "Desktop"
Description = "展開先のフォルダを選択してください"
}
# フォルダ選択の有無を判定
if($FolderBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
Write-Host "Expand zip files..."
foreach ($item in $zipfiles){
Write-Host $item.Name -ForegroundColor Green
# create directory
$destination = $item.FullName;
$destination = $FolderBrowser.SelectedPath + ($destination.Substring(0, $destination.Length - ($item.Extension).Length)).Replace(($basedir),'')
# expand into created directory
Expand-Archive -Force -LiteralPath $item.FullName -DestinationPath $destination
}
}