🤐

PowerShellで、ZIPファイルのフォルダ構造のみをコピーする

2020/10/23に公開

ZIP内のフォルダ構造と同じ構造を持つフォルダが欲しいが、ファイルの部分は要らない・・・というケースが発生したため、ファイルを無視してフォルダ構造のみをコピーする処理をPowerShellで雑に書いてみました。

実行イメージ

↓例えばこういう構造のZIPファイルを対象に実行すると

contents
├─Picture
│      picture1.jpg
├─Music
│  ├─teckno
│  │      teckno1.mp3
│  │      teckno2.mp3
│  └─classic
│          classic1.mp3
└─Videos

↓こういう構造のフォルダが得られる。

contents
├─Picture
├─Music
│  ├─teckno
│  └─classic
└─Videos

コード

GitHub上のリポジトリ

unzipOnlyDir.ps
# zipのパスを入力してもらう
Write-Host("zipファイルのパスを入力してください。")
$zipPath = Read-Host

# zipの存在確認
$isExt = (Test-Path $zipPath)
if (!$isExt) {
	Write-Host("対象のzipファイルが見つかりませんでした。終了します")
	Read-Host
	exit
}

# アセンブリを読み込む
add-type -assemblyname system.io.compression.filesystem
# フォルダリストを作る
$line = [io.compression.zipfile]::openread($zipPath).entries | Where-Object{ $_.name.length -eq 0} | Sort-Object
$folderList = $line -split "\\ "

# zipの親フォルダを特定
$zipParent = Split-Path $zipPath -Parent

# 親フォルダ直下に、行ごとにフォルダを生成
foreach($folder in $folderList){
	$target = $zipParent + "\" + $folder
	New-Item $target -itemType Directory -Force
}
Write-Host("フォルダの出力が完了しました。")

# 出力先のディレクトリを開く
$pathObject = [IO.FileInfo]$zipParent
Invoke-Item $pathObject

作っておいてなんですが、この程度の操作なら、わざわざコードを書かなくてもできる気がしてなりません・・・よりベターな方法を知っている方はコメントで情報を頂けると幸いです。

Discussion