MENU

Windows バッチスクリプトによる大量の ZIP ファイル作成(7-Zip 利用)

本記事では、7-Zip を利用して複数のフォルダを個別に ZIP 化するバッチスクリプトを作成する方法を解説する。本スクリプトは、エクスプローラーで複数のフォルダをドラッグ&ドロップするだけで、それぞれのフォルダを ZIP ファイルとして圧縮する。大量のフォルダを一括で ZIP 化する作業を効率化できる。

目次

スクリプトのコード

以下のバッチスクリプトを zip_folders.bat などの名前で保存し、デスクトップなどに配置することで、エクスプローラーからフォルダをドラッグ&ドロップするだけで ZIP 化できる。

@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion
set "sevenZip=C:\Program Files\7-Zip\7z.exe"

rem ドラッグ&ドロップされたすべてのフォルダを処理
for %%F in (%*) do (
    rem フォルダが存在するか確認
    if exist "%%~F" (
        set "folderPath=%%~dpF"
        set "folderName=%%~nxF"

        rem 各フォルダを個別に ZIP 化
        "%sevenZip%" a -tzip "!folderPath!!folderName!.zip" "%%~F\*"
    )
)

echo すべての ZIP 化が完了しました。
pause

スクリプトの詳細解説

1. @echo off

バッチスクリプトの実行時にコマンドの入力行を非表示にする。これにより、実行中のコマンドがコンソールに表示されず、出力がすっきりする。

2. chcp 65001 > nul

バッチスクリプトの文字コードを UTF-8(コードページ 65001) に変更する。これにより、日本語のファイル名やメッセージが文字化けしにくくなる。
> nul を付けることで、コードページ変更のメッセージを非表示にしている。

3. setlocal enabledelayedexpansion

遅延環境変数展開を有効にする。
バッチスクリプトでは、通常の set コマンドによる変数の値は即時展開されるため、for ループの中で set した変数を !変数名! の形式で使うと、リアルタイムで値が展開されるようになる。
これにより、for ループ内で set した folderPathfolderName を適切に扱えるようになる。

4. set "sevenZip=C:\Program Files\7-Zip\7z.exe"

7-Zip の実行ファイルのパスを変数 sevenZip に格納する。
7-Zip をデフォルトの場所にインストールしていない場合は、ここを適切なパスに変更する必要がある。

5. for %%F in (%*) do (...)

バッチファイルにドラッグ&ドロップされたすべてのフォルダを for ループで処理する。
%* はバッチスクリプトに渡されたすべての引数を表し、%%F にフォルダのパスが順番に渡される。

6. if exist "%%~F"

フォルダが実際に存在するかを確認する。存在しない場合はスキップする。

7. set "folderPath=%%~dpF"

%%~dpF を利用して、ドラッグ&ドロップされたフォルダの親ディレクトリのパスを取得する。

8. set "folderName=%%~nxF"

%%~nxF を利用して、フォルダの名前のみを取得する。

9. "%sevenZip%" a -tzip "!folderPath!!folderName!.zip" "%%~F\*"

7-Zip の a(追加)コマンドを使用して ZIP ファイルを作成する。

  • -tzip : ZIP 形式で圧縮(-t7z に変更すれば .7z 形式で圧縮可能)
  • !folderPath!!folderName!.zip : 出力する ZIP ファイルのフルパス(フォルダと同じディレクトリに作成)
  • "%%~F\*" : ZIP に含めるファイル(フォルダ内のすべてのファイル)

10. echo すべての ZIP 化が完了しました。

処理完了後にメッセージを表示する。

11. pause

pause を実行することで、スクリプト終了時に「続行するには何かキーを押してください...」と表示され、ユーザーがキーを押すまでコンソールが閉じない。


使用方法

  1. 上記のスクリプトを zip_folders.bat という名前で保存
  2. 圧縮したいフォルダを複数選択し、バッチファイルにドラッグ&ドロップ
  3. 各フォルダごとに ZIP ファイルが作成される

動作例

📂 入力(バッチファイルにドラッグ&ドロップするフォルダ)

D:\Projects\FolderA\
D:\Projects\FolderB\
D:\Projects\FolderC\

🔽 出力(ZIP ファイル)

D:\Projects\FolderA.zip
D:\Projects\FolderB.zip
D:\Projects\FolderC.zip


カスタマイズ

ZIP ファイルの保存先を変更

現在のスクリプトでは ZIP ファイルを元のフォルダと同じ場所に作成するが、特定のフォルダに保存したい場合は、以下のように変更する。

set "outputPath=D:\Compressed"
"%sevenZip%" a -tzip "!outputPath!\!folderName!.zip" "%%~F\*"

これにより、すべての ZIP ファイルが D:\Compressed フォルダに保存される。

7z 形式で圧縮

ZIP 形式ではなく 7z 形式 で圧縮したい場合は、以下のように変更する。

"%sevenZip%" a -t7z "!folderPath!!folderName!.7z" "%%~F\*"

注意点

  1. 7-Zip のインストールが必要
    • C:\Program Files\7-Zip\7z.exe7z.exe があることを確認する。
    • 違う場所にインストールされている場合は、set "sevenZip=..." を修正する。
  2. フォルダ名に ! ( ) などの特殊文字があると問題が発生する可能性
    • setlocal enabledelayedexpansion の影響で ! を含むフォルダ名は正しく処理されない可能性がある。
    • 必要ならフォルダ名の特殊文字を削除する処理を追加する。

まとめ

このバッチスクリプトを使用すると、エクスプローラーで複数のフォルダをドラッグ&ドロップするだけで、それぞれのフォルダを個別に ZIP 化できる。7-Zip のコマンドラインを活用することで、大量のフォルダを効率的に圧縮可能となる。

目次