こんにちは!今回はバッチファイルとPowerShellを組み合わせて複数のZipファイルをまとめて解凍する方法を紹介していきたいと思います。
Zipファイルはファイルやフォルダを圧縮するフォーマットとして非常に有名な形式の一つです。
一昔前までは、ファイルの圧縮解凍には専用のソフトをインストールする必要がありました。
ですが、今となってはほとんどのOSが標準で解凍する機能を実は持っています。
WindowsでもZipファイルをダブルクリックすると中身をみることができますしね。
ですが、Zipファイルのままではその中身のプログラムを実行したり、それを参照したプログラムなどは実行することが出来ません。
インターネットに接続していないPCや人のモノだったりするとソフトが入れるのも一苦労です。
そんな時に役立つ標準機能を使ったファイルの解凍方法として今回の方法を使ってみてはいかがでしょうか?
やりたいこと
Zipファイルが1つくらいであれば、「右クリック」して「すべて展開」でもよいと思います。そんなに難しいことでもありませんしね。
ですが、ファイルが大量にある場合、一つ一つするのはとてもめんどうですよね?10個を超えるともうしんどいです。
そんなときは下記のコードをコピーしてバッチを作ってみてください。
スクリプト例
@echo off
cd /d %~dp0
dir /b /s *.zip>%~dp0zips.txt
for /f %%a in (%~dp0zips.txt) do (
powershell -command "Expand-Archive -Path %%a -DestinationPath %%~na"
)
使い方
1.Zipファイルを一つのフォルダにまとめる
2.そのフォルダの中に先ほど作成したバッチファイルを入れる
3.バッチファイルをダブルクリックで実行する
すると、同じフォルダ内に解凍されたファイルが出来上がります!
解説
Zipファイルのリストをテキストに取得
①「dir /b /s *.zip>%~dp0zips.txt」
このコマンドで、作成したバッチと同じフォルダにある拡張子zipのファイル名一覧を、同じフォルダの「zips.txt」ファイルに出力しています。
「dir」コマンドについては、以下ページで詳細に解説しています。よかったら参考にしてみてください。
テキストファイルのファイルリストを一個ずつ解凍コマンドに受け渡す
②「for /f %%a in ('%~dp0zips.txt') do ( powershell -command "Expand-Archive -Path %%a -DestinationPath %%~na" )」
上記の①で作成した「ZIPファイルのファイル名一覧」のテキストファイルから1行ずつ読み込み、PowerShellのファイルを解凍(展開)するコマンド「Expand-Archive」で解凍(展開)しています。
あとがき
今回は、PowerShellの「Expand-Archive」を使った複数のZipファイルの解凍方法について紹介させていただきました。
ネットで調べてみるとたくさん「ZIP」をまとめて解凍できるソフトはダウンロードできると思います。個人で使用する場合はそういったソフトを使用するほうが断然楽ですね。
ソフトをインストールする手間や、ネットワークに接続することの安全性の確保は業務でパソコンをいじる人にとっては死活問題だったりします。また、会社の貸与PCのため、ソフトを勝手にインストールできないけどZIPファイルが大量にある!場合もあるでしょう。
ですが、この方法の真骨頂は、「コマンドでZIPを解凍したい」といった時ですね。
バッチやパワーシェルでこれができると、ファイルのバックアップやファイルのコピーなどを行う時に容量を抑えられますね。
何かのお役に立てれば幸いです。
コメント
すいません。教えて欲しいです。
沢山あるzipデータを ①解凍→②リネーム しようとしてます。
@echo off
cd /d %~dp0
dir /b /s *.zip>%~dp0ziplist.txt
for /f %%a in (%~dp0ziplist.txt) do (
cd C:\Program Files\7-Zip
7z.exe e -y -o%~dp0 %%a
ーーーリネーム処理ーーーー
for /f ” tokens=1,2 delims=,” %%a in (a.csv) do (
set head=%%a%%b&goto :exit_for
:exit_for
ren a.csv %head%.csv
)
ーーーーーーー
pause
ーー問題点ーーーーー
for文を入れ子状にする方法がわかりません。
フォルダ内のzipデータをリスト化し一つずつ解凍して、解凍したデータをリネーム対象にパス指定するにはどうしたら良いのか?
こんばんは。なるほど、For文の中にFor文を入れる場合ということですね。
今Windows機を触る環境にないため詳しくは調べられないのですが、For文の中に%環境変数%を入れる場合は遅延環境関数にしないと正確に読み出すことができません。
その部分だけに問題がある場合は、「@setlocal enabledelayedexpansion」をスクリプトの上部に書き加えてから「%」を「!」に置き換えると動くかもしれません。
@setlocal enabledelayedexpansion
@echo off
cd /d %~dp0
dir /b /s *.zip>%~dp0ziplist.txt
for /f %%a in (%~dp0ziplist.txt) do (
cd C:\Program Files\7-Zip
7z.exe e -y -o%~dp0 %%a
ーーーリネーム処理ーーーー
for /f ” tokens=1,2 delims=,” !!a in (a.csv) do (
set head=!!a!!b&goto :exit_for
:exit_for
ren a.csv !head!.csv
)
ーーーーーーー
pause
恐らく遅延環境関数の部分がクリアされればほぼ完成に近いかとおもいますので、参考にしていただければと思います。
回答有難う御座います。参考にさせて頂きます。
因みにあれから、色々調べてわかったのですが、遅延環境関数(環境変数はコマンド前に展開されてしまい、変数変化しない問題 )でなく、ラベル処理はfor文を抜けてしまう(対策としてサブルーチンを読み込む)でした。
それと、for文をネスト「全データをzip解凍+csvリネーム 」するのでなく、
独立したfor文「zip解凍全部する→csvリネーム全部する」の処理でも本意ではない(解凍データ大量だと使いずらい)けど許容範囲だと気付いて、作成出来ました。
此処のサイトで色々、不明点が解決でき助かりました。有難う御座いました。
自己解決されたのですね!おめでとうございます。
ご自分でそこまでお調べできる方のご参考になったのであれば本望です。
私も良く詰まるときに情報がなかなかでないのは辛かったですから…
これからも情報発信はしていくつもりではありますので、よろしくお願いいたします。