【bat】パスワード付きZIPを自動生成するバッチファイル完全ガイド|7-Zip・AES-256暗号化・パスワード管理・一括処理・エラー処理まで徹底解説

【bat】パスワード付きZIPを自動生成するバッチファイルの作り方|暗号化・一括処理対応 bat

機密ファイルをメールで送る際や、クラウドに保存する前の保護手段として「パスワード付きZIP」を使う場面は多いです。しかし毎回GUIで操作するのは手間がかかります。バッチファイルを使えばこの作業を完全自動化でき、定期バックアップや業務フローにそのまま組み込めます。

本記事では7-ZipとバッチファイルでパスワードAES-256暗号化ZIPを作成する方法を、暗号化方式の選択・パスワードの安全な管理・エラー処理・実践テンプレートまで体系的に解説します。

この記事で分かること

  • Windows標準コマンドではパスワード付きZIPが作れない理由と代替手段
  • AES-256とZipCryptoの違い(なぜAES-256一択なのか)
  • パスワードをバッチファイルに直書きしない安全な管理方法
  • 複数フォルダを一括でパスワード付きZIP化する方法
  • エラー処理・ログ出力付きの実践テンプレート
スポンサーリンク

Windows標準でパスワード付きZIPは作れるか

結論から言うと、Windowsに標準搭載されているコマンドではパスワード付きZIPは作れません。よく試みられる方法とその実態を整理します。

手段 パスワード付きZIP 暗号化強度 備考
Windowsエクスプローラー(右クリック) ✗ 不可 パスワード設定UIがない
PowerShell(Compress-Archive) ✗ 不可 パスワードパラメータ未実装
tar(Windows 10以降) ✗ 不可 ZIP暗号化非対応
7-Zip(7z.exe) ✓ 対応 AES-256 無料・コマンドライン対応・推奨
WinRAR ✓ 対応 AES-256 有料ライセンス必要
7-Zipを使う理由:無料・オープンソース・コマンドライン対応・AES-256暗号化対応の3拍子が揃っています。業務環境でも広く使われており、バッチファイルとの相性も抜群です。

AES-256とZipCryptoの違い

7-ZipでZIP形式のパスワード保護をかける際、暗号化方式の選択が重要です。デフォルト設定のままだと古い方式が使われることがあり、セキュリティ上のリスクが生じます。

方式 強度 解読リスク 互換性 7-Zipオプション
ZipCrypto(従来方式) 非常に弱い 既知平文攻撃で解読可能 高(古いソフトでも開ける) デフォルト
AES-256 強い 実質解読不可能 中(7-Zip/WinZip/WinRAR等) -mem=AES256
重要-mem=AES256オプションを省略するとZipCryptoが使われます。ZipCryptoはファイルの一部が分かれば内容を解読できる脆弱性があるため、機密ファイルには必ずAES-256を指定してください。

7-Zipのインストールと準備

7-Zipの公式サイトからインストーラーをダウンロードしてインストールします。インストール後、7z.exeのパスを確認しておきます。

7z.exeのパス確認
rem デフォルトのインストールパスを確認
dir "C:\Program Files\7-Zip\7z.exe"
dir "C:\Program Files (x86)\7-Zip\7z.exe"

どちらかにファイルが存在すればインストール済みです。インストールされていない場合は以下のコマンドでパスを検索できます。

7z.exeを検索
where 7z.exe 2>nul
if %ERRORLEVEL% neq 0 (
    echo 7z.exe が見つかりません。7-Zipをインストールしてください。
    exit /b 1
)

基本:単一フォルダをパスワード付きZIPに圧縮する

まず最もシンプルな例として、指定フォルダをパスワード付きZIPに圧縮するバッチファイルを作ります。

basic_zip_password.bat
@echo off
setlocal enabledelayedexpansion

rem ===== 設定 =====
set ZIP_CMD="C:\Program Files\7-Zip\7z.exe"
set INPUT_DIR=C:\zip_target
set OUTPUT_DIR=C:\zip_output
set PASSWORD=your_password_here

rem ===== 出力フォルダ作成 =====
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

rem ===== 日付付きZIPファイル名 =====
set ZIP_FILE=%OUTPUT_DIR%\backup_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.zip

rem ===== パスワード付きZIP作成(AES-256暗号化)=====
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p%PASSWORD% -mem=AES256

if %ERRORLEVEL% equ 0 (
    echo 圧縮完了: %ZIP_FILE%
) else (
    echo [ERROR] 圧縮に失敗しました。
    exit /b 1
)
pause

7-Zipの主要オプションの意味を整理します。

オプション 意味
a アーカイブに追加(新規作成含む)
-tzip ZIP形式を指定
-p%PASSWORD% パスワードを設定
-mem=AES256 AES-256暗号化を使用(必須)
-r サブフォルダを再帰的に含める
-mx=5 圧縮率 0〜9(デフォルト5)

パスワードの安全な管理方法

パスワードをバッチファイルに直書きするのはセキュリティ上の重大なリスクです。バッチファイルをバージョン管理に含めたり、同僚と共有したりする際に意図せず漏洩します。

NG:バッチファイルへの直書き
バッチファイルはプレーンテキストです。ファイルさえ見れば誰でもパスワードが分かります。特にGitリポジトリへのコミット、共有フォルダへの設置は危険です。

安全なパスワード管理の方法を3つ紹介します。

方法①:外部テキストファイルから読み込む

パスワードを別ファイルに保存し、アクセス制限をかけます。バッチファイル自体はGit管理でき、パスワードファイルは.gitignoreで除外できます。

password.txt(パスワードファイル)
your_secure_password
外部ファイルからパスワード読み込み
@echo off
setlocal enabledelayedexpansion

rem パスワードファイルのパス
set PASS_FILE=%~dp0password.txt

rem パスワードファイルの存在確認
if not exist "%PASS_FILE%" (
    echo [ERROR] パスワードファイルが見つかりません: %PASS_FILE%
    exit /b 1
)

rem ファイルから1行目を読み込む
set /p PASSWORD=<"%PASS_FILE%"

rem 後続の処理でパスワードを使用
echo パスワード読み込み完了(内容は非表示)

方法②:実行時にユーザー入力を求める

スクリプト実行時にパスワードを入力させる方式です。パスワードがどこにも保存されないため最も安全ですが、自動化には不向きです。

実行時にパスワード入力
@echo off
setlocal enabledelayedexpansion

rem パスワードを実行時に入力(画面には表示されない)
set /p PASSWORD=ZIPのパスワードを入力してください: 

if "%PASSWORD%"=="" (
    echo [ERROR] パスワードが入力されていません。
    exit /b 1
)

echo パスワードが設定されました。

方法③:環境変数から読み込む

システム環境変数やユーザー環境変数にパスワードを設定し、バッチからはその変数を参照します。サーバーのタスクスケジューラで使う際に適しています。

環境変数からパスワード読み込み
@echo off
setlocal enabledelayedexpansion

rem 環境変数 ZIP_PASSWORD を使用
if "%ZIP_PASSWORD%"=="" (
    echo [ERROR] 環境変数 ZIP_PASSWORD が設定されていません。
    echo システム環境変数に ZIP_PASSWORD を設定してから実行してください。
    exit /b 1
)

set PASSWORD=%ZIP_PASSWORD%
echo 環境変数からパスワードを読み込みました。

複数フォルダを一括でパスワード付きZIP化する

業務でよくある「複数のプロジェクトフォルダを毎日一括でバックアップしたい」という要件に対応します。

パターン①:サブフォルダをそれぞれ個別にZIP化

各サブフォルダを個別にZIP化
@echo off
setlocal enabledelayedexpansion

set ZIP_CMD="C:\Program Files\7-Zip\7z.exe"
set BASE_DIR=C:\zip_targets
set OUTPUT_DIR=C:\zip_output
set PASSWORD=your_password_here
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

set SUCCESS_COUNT=0
set ERROR_COUNT=0

for /d %%F in ("%BASE_DIR%\*") do (
    set FOLDER_NAME=%%~nF
    set ZIP_PATH=%OUTPUT_DIR%\!FOLDER_NAME!_%DATE_STR%.zip

    echo 処理中: %%F
    %ZIP_CMD% a -tzip "!ZIP_PATH!" "%%F\*" -p%PASSWORD% -mem=AES256 >nul 2>&1

    if !ERRORLEVEL! equ 0 (
        echo   完了: !ZIP_PATH!
        set /a SUCCESS_COUNT+=1
    ) else (
        echo   [ERROR] 圧縮失敗: %%F
        set /a ERROR_COUNT+=1
    )
)

echo.
echo ===== 処理結果 =====
echo 成功: %SUCCESS_COUNT% 件
echo 失敗: %ERROR_COUNT% 件
pause

パターン②:指定したフォルダリストをZIP化

圧縮対象フォルダをリストファイルで管理する方法です。対象の追加・変更がテキスト編集だけで済みます。

targets.txt(圧縮対象リスト)
C:\projects\project_A
C:\projects\project_B
C:\reports\monthly
リストファイルから一括ZIP化
@echo off
setlocal enabledelayedexpansion

set ZIP_CMD="C:\Program Files\7-Zip\7z.exe"
set TARGET_LIST=%~dp0targets.txt
set OUTPUT_DIR=C:\zip_output
set PASSWORD=your_password_here
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

if not exist "%TARGET_LIST%" (
    echo [ERROR] targets.txt が見つかりません
    exit /b 1
)
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

for /f "usebackq delims=" %%L in ("%TARGET_LIST%") do (
    if exist "%%L" (
        set FOLDER_NAME=%%~nL
        set ZIP_PATH=%OUTPUT_DIR%\!FOLDER_NAME!_%DATE_STR%.zip
        %ZIP_CMD% a -tzip "!ZIP_PATH!" "%%L\*" -p%PASSWORD% -mem=AES256 >nul 2>&1
        if !ERRORLEVEL! equ 0 (
            echo 完了: !ZIP_PATH!
        ) else (
            echo [ERROR] 失敗: %%L
        )
    ) else (
        echo [WARN] 対象フォルダが存在しません: %%L
    )
)
pause

エラーハンドリングとログ出力

業務用バッチでは処理結果をログに残すことが重要です。特にタスクスケジューラから無人実行する場合、ログがなければ問題を検知できません。

ログ出力付きZIP圧縮
@echo off
setlocal enabledelayedexpansion

set ZIP_CMD="C:\Program Files\7-Zip\7z.exe"
set INPUT_DIR=C:\zip_target
set OUTPUT_DIR=C:\zip_output
set LOG_DIR=C:\zip_logs
set PASSWORD=your_password_here

rem ログフォルダ作成
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

rem ログファイル名(日付付き)
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set TIME_STR=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
set TIME_STR=%TIME_STR: =0%
set LOG_FILE=%LOG_DIR%\zip_log_%DATE_STR%_%TIME_STR%.txt
set ZIP_FILE=%OUTPUT_DIR%\backup_%DATE_STR%.zip

call :log "===== ZIP圧縮開始: %DATE_STR% %TIME_STR% ====="
call :log "対象: %INPUT_DIR%"
call :log "出力: %ZIP_FILE%"

if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

rem 圧縮実行
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p%PASSWORD% -mem=AES256 >> "%LOG_FILE%" 2>&1

if %ERRORLEVEL% equ 0 (
    call :log "圧縮完了: %ZIP_FILE%"
    exit /b 0
) else (
    call :log "[ERROR] 圧縮失敗 ERRORLEVEL=%ERRORLEVEL%"
    exit /b 1
)

:log
echo %~1
echo %~1 >> "%LOG_FILE%"
exit /b 0

よくある落とし穴と対処法

落とし穴①:パスにスペースが含まれている

パスにスペースを含む場合、ダブルクォートで囲まないとエラーになります。

NG:スペース含みパス
rem スペースを含むパスはエラーになる
set INPUT_DIR=C:\My Documents\zip_target
%ZIP_CMD% a -tzip %ZIP_FILE% %INPUT_DIR%\* -p%PASSWORD%
OK:ダブルクォートで囲む
rem パスは必ずダブルクォートで囲む
set INPUT_DIR=C:\My Documents\zip_target
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p%PASSWORD% -mem=AES256

落とし穴②:パスワードにスペースや特殊文字が含まれている

パスワード自体にスペースや記号(^ & ! など)が含まれると、コマンドラインで意図しない解釈をされることがあります。

パスワードの特殊文字対策
rem スペースを含むパスワードはダブルクォートで囲む
set PASSWORD=my password 123
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p"%PASSWORD%" -mem=AES256

rem ^ や & はキャレットでエスケープが必要な場合もある
rem 可能な限りシンプルな英数字パスワードを推奨

落とし穴③:既存ZIPに上書きすると古い内容が残る

7-Zipのaコマンドは「追加」であり、既存ZIPに対して実行すると古いファイルも残ります。毎回新規作成するには既存ファイルを削除してから実行します。

既存ZIPを削除してから新規作成
set ZIP_FILE=%OUTPUT_DIR%\backup.zip

rem 既存ファイルを削除
if exist "%ZIP_FILE%" del /f "%ZIP_FILE%"

rem 新規作成
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p%PASSWORD% -mem=AES256

落とし穴④:日本語ファイル名の文字化け

ZIP内の日本語ファイル名が解凍時に文字化けする場合があります。7-Zipは標準でUnicodeに対応していますが、Windows標準の解凍機能(エクスプローラー)との互換性に注意が必要です。

UTF-8設定で文字化け対策
rem -mcu=on で ZIPのUTF-8エンコードを強制(7-Zip同士での解凍が前提)
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p%PASSWORD% -mem=AES256 -mcu=on

rem 受け渡し先がWindowsエクスプローラーで解凍する場合は
rem -mcu=on を外してCP932(Shift-JIS)のままにする
互換性の選択-mcu=onはUnicode対応の解凍ソフト(7-Zip・WinZip・WinRAR)では正しく表示されますが、Windowsエクスプローラーの標準解凍では文字化けする場合があります。受け渡し先の環境に合わせて選択してください。

完全な実践テンプレート

これまでの内容を統合した、業務での実用に耐える完全なテンプレートです。7-Zipの存在チェック・パスワードの外部ファイル読み込み・ログ出力・エラー処理がすべて含まれています。

zip_with_password.bat(完全テンプレート)
@echo off
setlocal enabledelayedexpansion

rem ===== 設定(ここを環境に合わせて変更)=====
set ZIP_CMD="C:\Program Files\7-Zip\7z.exe"
set INPUT_DIR=C:\zip_target
set OUTPUT_DIR=C:\zip_output
set LOG_DIR=C:\zip_logs
set PASS_FILE=%~dp0password.txt

rem ===== 初期化 =====
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set TIME_STR=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
set TIME_STR=%TIME_STR: =0%
set LOG_FILE=%LOG_DIR%\zip_%DATE_STR%_%TIME_STR%.log
set ZIP_FILE=%OUTPUT_DIR%\backup_%DATE_STR%.zip

rem ===== フォルダ作成 =====
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

call :log "===== 処理開始: %DATE% %TIME% ====="

rem ===== 7z.exe の存在確認 =====
if not exist %ZIP_CMD% (
    call :log "[ERROR] 7z.exe が見つかりません: %ZIP_CMD%"
    exit /b 1
)

rem ===== パスワードファイルの読み込み =====
if not exist "%PASS_FILE%" (
    call :log "[ERROR] パスワードファイルが見つかりません: %PASS_FILE%"
    exit /b 1
)
set /p PASSWORD=<"%PASS_FILE%"
if "%PASSWORD%"=="" (
    call :log "[ERROR] パスワードが空です"
    exit /b 1
)

rem ===== 対象フォルダの確認 =====
if not exist "%INPUT_DIR%" (
    call :log "[ERROR] 対象フォルダが存在しません: %INPUT_DIR%"
    exit /b 1
)

rem ===== 既存ZIPの削除(毎回新規作成)=====
if exist "%ZIP_FILE%" (
    call :log "既存ZIPを削除: %ZIP_FILE%"
    del /f "%ZIP_FILE%"
)

rem ===== ZIP圧縮実行 =====
call :log "圧縮開始: %INPUT_DIR% -> %ZIP_FILE%"
%ZIP_CMD% a -tzip "%ZIP_FILE%" "%INPUT_DIR%\*" -p%PASSWORD% -mem=AES256 >> "%LOG_FILE%" 2>&1

if %ERRORLEVEL% equ 0 (
    call :log "圧縮完了: %ZIP_FILE%"
    call :log "===== 処理成功 ====="
    exit /b 0
) else (
    call :log "[ERROR] 圧縮失敗 ERRORLEVEL=%ERRORLEVEL%"
    call :log "===== 処理失敗 ====="
    exit /b 1
)

:log
echo %~1
echo %~1 >> "%LOG_FILE%"
exit /b 0

7-Zipの便利なオプション一覧

オプション 説明
-mx=N 圧縮率(0=無圧縮, 5=標準, 9=最高) -mx=9
-mmt=N マルチスレッド数(onで自動) -mmt=on
-r サブフォルダを再帰的に処理 -r
-x!*.log 指定パターンのファイルを除外 -x!*.tmp -x!*.log
-v100m 分割アーカイブ(100MB単位) -v500m
-sdel 圧縮後に元ファイルを削除 -sdel(注意)
-mhe=on ファイル名もAES-256暗号化(7z形式のみ) -mhe=on
ファイル名暗号化について-mhe=onでファイル名まで暗号化できますが、これは7z形式(-t7z)専用オプションです。ZIP形式(-tzip)では通常ファイル名は暗号化されません。機密性が特に高い場合は7z形式の使用を検討してください。

関連記事

よくある質問

Q. 7-Zipが入っていないPCでも実行できますか?
A. いいえ、7-Zipのインストールが必要です。ただしポータブル版の7z.exeをバッチファイルと同じフォルダに配置しておけばインストールなしで使えます。set ZIP_CMD=%~dp07z.exeのようにバッチファイルのあるフォルダからの相対パスで参照できます。
Q. 作成したZIPファイルが正しく暗号化されているか確認する方法は?
A. コマンドラインで 7z l -slt ファイル名.zip を実行します。Encrypted = + と表示され、MethodAES-256 が含まれていれば正しく暗号化されています。エクスプローラーでZIPを開こうとしたときにパスワードを求められるかで確認することもできます。
Q. 圧縮後に元のファイルを自動的に削除したい場合は?
A. -sdel オプションを追加すると圧縮後に元ファイルを削除します。ただし圧縮が成功した場合でも元ファイルが消えますので、バックアップ目的には使わず、「圧縮してアーカイブとして保管し元は不要」な場合に限って使用してください。必ず先に-sdelなしでテストすることを推奨します。
Q. タスクスケジューラから自動実行したい場合の注意点は?
A. タスクスケジューラからの実行では作業ディレクトリが異なるため、%~dp0(バッチファイルのあるフォルダ)を使ってパスワードファイル等のパスを構成してください。また管理者権限が必要な場合は「最上位の特権で実行する」オプションを有効にします。詳細はタスクスケジューラから実行したときだけ動作が異なる原因と解決策を参照してください。
Q. パスワードを忘れた場合に復元する方法はありますか?
A. AES-256で暗号化したZIPはパスワードなしで復元する手段が実質的にありません。これはセキュリティ上は正しい動作です。パスワードは必ずパスワードマネージャーや別の安全な場所に記録しておいてください。バッチファイルとパスワードファイルのバックアップも併せて取っておくことを推奨します。