フォルダをまたがって存在している大量のzipファイルを、一か所に集約して一括解凍する

 

やりたいこと

以下「フォルダ構造イメージ」のような形で、フォルダをまたがりながら大量のzipファイルが存在している。一つ一つ階層たどってファイルにたどり着いては解凍するという作業をしているが、とにかく時間がかかるし、階層を何回も上ったり下ったりしているとうっかり解凍し忘れるファイルも出てくる。自動化することにした。

 

また、解凍後は中を確認していくという作業があるので、フォルダをまたがって存在しているのも避けたい。ファイルは1か所にまとめることにする。

 

フォルダ構造イメージ

解凍したいzipファイルは複数のフォルダに散在。以下はイメージにつき2ファイルしかないが、実際は十数ファイル程ある。

 

手順

①以下を記載したバッチファイルを作成する。

(バッチファイルの作成方法:メモ帳に以下をコピペしファイルを保存して閉じた後、ファイルの拡張子を.batに変更)

 

cd /d C:\Users\…(※1)
for /r %%i in (*.zip) do copy %%i C:\Users…(※2)

@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)「この階層配下のファイルを集めたい」と思っている階層のパス(上記イメージ例の場合、AAフォルダとBBフォルダの親フォルダ。赤枠の部分の値)

(※2)集め先のパス(任意。「このフォルダに集めたい」と思うパス。)

 

②バッチファイルを配置し実施する

上記で作ったバッチファイルを、(※2)集め先のパスに配置する。



 

 

 

配置後、ダブルクリックして実行すると・・

 

 

解凍された。zip.txtは不要なので消してOK。

 

解説

cd /d C:\Users\…(※1) 

カレントディレクトリの変更をするコマンド。/dはドライブをまたがる変更をしたい場合には必要。

 

for /r %%i in (*.zip) do copy %%i C:\Users…(※2)

特定の処理を繰り返すためのコマンド。今回は、複数のファイルをコピーしてきたいので、ファイルの数だけコピーを繰り返す必要があることから必要な一文。Forコマンドの基本的な記述方法は以下。

FOR (オプション) %%変数 IN (繰り返し処理をしたい対象) DO コマンド

変数は、コマンドラインで使用する場合は%変数と記述し、今回のようにバッチファイルに記述する場合は%%変数とする。

 

(オプション)…今回記述した/rはディレクトリ名およびサブディレクトリ名を対象にするという意。

 

参考にさせていただいた情報↓

 

cd /d %~dp0

%0…バッチファイル自身

~dp…~は、フォルダ名にスペースが入る場合の対策のためにパスに自動でついてくる""を削除する意。Program Filesを"Program Fies"と認識しているが、これの””を外す。dはドライブ名を抽出する、pはファイル名以外のパスを抽出する意味。

→つまり、cd /d %~dp0で、カレントディレクトリを、そのバッチファイルがあるディレクトリに移動させている。

 

dir /b /s *.zip>%~dp0zips.txt

dirコマンドはファイル・ディレクトリ情報を表示するコマンド。

/b は、ファイル名のみを表示させるためのオプション。

/s は、サブディレクトリは以下のファイルも含めて表示させるためのオプション。

>はリダイレクト機能と言い、実行結果を>より右に記載したファイル名のファイルに書き込んでいる。

 

for /f %%a in (%~dp0zips.txt) do (
powershell -command "Expand-Archive -Path %%a -DestinationPath %%~na"

Forコマンドの基本的な記述方法は上述の通り。/fはテキストファイルの内容を取得して変数に代入するオプション。今回は、上記dir /b /s *.zip>%~dp0zips.txtで%~dp0zips.txtというテキストファイルを作ったので、その中に記載されている内容(つまり今回の場合、dir /b /s *.zipの実行結果であり、すなわち解凍したいzipファイルのフルパス)を変数に代入している。

 

powershell -command "Expand-Archive -Path %%a -DestinationPath %%~na"は、Powershellのコマンドで、ファイル解凍をする際のコマンド。

 

 

qiita.com