機密ファイルをメールで送る際や、クラウドに保存する前の保護手段として「パスワード付き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 | 有料ライセンス必要 |
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のパスを確認しておきます。
rem デフォルトのインストールパスを確認 dir "C:\Program Files\7-Zip\7z.exe" dir "C:\Program Files (x86)\7-Zip\7z.exe"
どちらかにファイルが存在すればインストール済みです。インストールされていない場合は以下のコマンドでパスを検索できます。
where 7z.exe 2>nul
if %ERRORLEVEL% neq 0 (
echo 7z.exe が見つかりません。7-Zipをインストールしてください。
exit /b 1
)
基本:単一フォルダをパスワード付きZIPに圧縮する
まず最もシンプルな例として、指定フォルダをパスワード付きZIPに圧縮するバッチファイルを作ります。
@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) |
パスワードの安全な管理方法
パスワードをバッチファイルに直書きするのはセキュリティ上の重大なリスクです。バッチファイルをバージョン管理に含めたり、同僚と共有したりする際に意図せず漏洩します。
バッチファイルはプレーンテキストです。ファイルさえ見れば誰でもパスワードが分かります。特にGitリポジトリへのコミット、共有フォルダへの設置は危険です。
安全なパスワード管理の方法を3つ紹介します。
方法①:外部テキストファイルから読み込む
パスワードを別ファイルに保存し、アクセス制限をかけます。バッチファイル自体はGit管理でき、パスワードファイルは.gitignoreで除外できます。
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化
@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化
圧縮対象フォルダをリストファイルで管理する方法です。対象の追加・変更がテキスト編集だけで済みます。
C:\projects\project_A C:\projects\project_B C:\reports\monthly
@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
エラーハンドリングとログ出力
業務用バッチでは処理結果をログに残すことが重要です。特にタスクスケジューラから無人実行する場合、ログがなければ問題を検知できません。
@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
よくある落とし穴と対処法
落とし穴①:パスにスペースが含まれている
パスにスペースを含む場合、ダブルクォートで囲まないとエラーになります。
rem スペースを含むパスはエラーになる set INPUT_DIR=C:\My Documents\zip_target %ZIP_CMD% a -tzip %ZIP_FILE% %INPUT_DIR%\* -p%PASSWORD%
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に対して実行すると古いファイルも残ります。毎回新規作成するには既存ファイルを削除してから実行します。
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標準の解凍機能(エクスプローラー)との互換性に注意が必要です。
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の存在チェック・パスワードの外部ファイル読み込み・ログ出力・エラー処理がすべて含まれています。
@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形式の使用を検討してください。関連記事
- 【bat】バッチファイルでZIP圧縮を簡単に実行する方法(パスワードなしの基本的な圧縮方法)
- 【bat】バッチファイルでZIPファイルを解凍する方法完全ガイド(圧縮とセットで覚えておきたい解凍処理)
- 【bat】日付と時間をファイル名に挿入する方法完全ガイド(バックアップファイルへの日付付与テクニック)
よくある質問
set ZIP_CMD=%~dp07z.exeのようにバッチファイルのあるフォルダからの相対パスで参照できます。7z l -slt ファイル名.zip を実行します。Encrypted = + と表示され、Method に AES-256 が含まれていれば正しく暗号化されています。エクスプローラーでZIPを開こうとしたときにパスワードを求められるかで確認することもできます。-sdel オプションを追加すると圧縮後に元ファイルを削除します。ただし圧縮が成功した場合でも元ファイルが消えますので、バックアップ目的には使わず、「圧縮してアーカイブとして保管し元は不要」な場合に限って使用してください。必ず先に-sdelなしでテストすることを推奨します。%~dp0(バッチファイルのあるフォルダ)を使ってパスワードファイル等のパスを構成してください。また管理者権限が必要な場合は「最上位の特権で実行する」オプションを有効にします。詳細はタスクスケジューラから実行したときだけ動作が異なる原因と解決策を参照してください。

