月曜日, 6月 9, 2025
- Advertisment -
ホームニューステックニュースPowerShellでワンクリック!ZIP一括展開&平坦化まとめ手順 #zip - Qiita

PowerShellでワンクリック!ZIP一括展開&平坦化まとめ手順 #zip – Qiita



PowerShellでワンクリック!ZIP一括展開&平坦化まとめ手順 #zip - Qiita

ChatGPT Image 2025年6月8日 00_39_58.png

ZIPファイルの中にZIPファイル、ひとつひとつクリックしてコピペしてまとめる
イライラする!!!
そんなイライラを解決する
簡単にぜーんぶ一つのフォルダに展開して欲しい のやり方っす
生成AIに聞けば、こんな事も自動化できるんですね(笑)

前提条件

  • Windows 7以降(PowerShell v2以上)が利用可能なPC
  • デスクトップに以下のフォルダをあらかじめ作成
    • ZIP (展開前のファイルを置く)
    • open(展開後をまとめる)

スクリプトの準備

  1. テキストエディタで新規ファイルを開く
  2. 以下をコピペして
    $sourceFolder=”C:\Users\Desktop\ZIP”
    $destinationFolder=”C:\Users\Desktop\open”
    のファイルパスを実際の”ZIP””oprn”フォルダのパスに変更
  3. UnpackAll.ps1 として保存(ファイル名を間違えないよう注意)

フォルダパスの調べ方(Windows)

  • エクスプローラーで対象のフォルダを開く

  • アドレスバーをクリックするとパスがテキスト表示に切り替わる

  • Ctrl + C でコピーし、UnpackAll.ps1 の該当箇所に貼り付け

  • 例: C:\Users\saway\Desktop\ZIP のように、\ をエスケープせずそのまま貼り付けてOKです。

# Filename: UnpackAll.ps1
# ------------ 設定 ------------
$sourceFolder      = 'C:\Users\\Desktop\ZIP'
$destinationFolder = 'C:\Users\\Desktop\open'

# ------------ 準備 ------------
Add-Type -AssemblyName System.IO.Compression.FileSystem
$shiftJIS = [System.Text.Encoding]::GetEncoding(932)

if (-not (Test-Path $destinationFolder)) {
    New-Item -ItemType Directory -Path $destinationFolder | Out-Null
}

# ------------ 平坦展開用関数 ------------
function Expand-ZipFlatten {
    param($zipPath, $outDir)

    Write-Host "展開 (平坦/SJIS):" $zipPath

    # 一時フォルダを作成
    $temp = Join-Path $env:TEMP ([GUID]::NewGuid().ToString())
    New-Item -ItemType Directory -Path $temp | Out-Null

    try {
        # SJIS 指定で全展開
        [System.IO.Compression.ZipFile]::ExtractToDirectory($zipPath, $temp, $shiftJIS)

        # 一時フォルダ内のすべてのファイルを平坦化コピー
        Get-ChildItem -Path $temp -Recurse -File | ForEach-Object {
            $target = Join-Path $outDir $_.Name
            Copy-Item -LiteralPath $_.FullName -Destination $target -Force -ErrorAction SilentlyContinue
        }
    }
    finally {
        # 一時フォルダを丸ごと削除
        Remove-Item -LiteralPath $temp -Recurse -Force
    }
}

# ------------ メイン処理 ------------

# 1) 元フォルダ内の ZIP を平坦展開+削除
Get-ChildItem -Path $sourceFolder -Recurse -Filter '*.zip' | ForEach-Object {
    Expand-ZipFlatten $_.FullName $destinationFolder
    Remove-Item -LiteralPath $_.FullName -Force
}

# 2) 元フォルダ内の非ZIPをまとめコピー
Get-ChildItem -Path $sourceFolder -Recurse -File |
    Where-Object { $_.Extension -ne '.zip' } |
    Copy-Item -Destination $destinationFolder -Force

# 3) ネストZIPにも同じ処理をループ
do {
    $nested = Get-ChildItem -Path $destinationFolder -Filter '*.zip'
    if ($nested.Count -gt 0) {
        $nested | ForEach-Object {
            Expand-ZipFlatten $_.FullName $destinationFolder
            Remove-Item -LiteralPath $_.FullName -Force
        }
    }
} while ($nested.Count -gt 0)

Write-Host "▶ すべてのファイルを '$destinationFolder' に平坦にまとめました!"

実行方法

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
powershell -ExecutionPolicy Bypass -File .\UnpackAll.ps1

実行例

展開 (平坦/SJIS): C:\Users\saway\Desktop\ZIP\xxx.zip
▶ すべてのファイルを 'C:\Users\saway\Desktop\open' に平坦にまとめました!

FAQ

  • 管理者権限が必要?
    → CurrentUser スコープの実行ポリシーなら不要です。
  • 文字化けする?
    → ZIP が Shift-JIS 以外で圧縮されている場合は、
    [System.Text.Encoding]::GetEncoding(932)932 を適切なコードページに変更してください。
  • PowerShell が使えない場合
    → 7-Zip CLI (7z.exe) を使うバッチファイル版を検討してください。





Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -