【bat】バッチファイルでZIP圧縮する方法|PowerShell・7-Zip・日付付きバックアップまで

【bat】バッチファイルでZIP圧縮する方法|PowerShell・7-Zip・日付付きバックアップまで bat

Windowsでフォルダやログ、バックアップファイルを定期的にZIP圧縮したい場合、バッチファイルにしておくと手作業を減らせます。単発の圧縮なら右クリックでも足りますが、毎日同じフォルダを圧縮する、日付付きのZIP名で保存する、失敗したら処理を止める、といった運用ではバッチ化したほうが安全です。

この記事では、Windows標準の PowerShell Compress-Archive を使う方法と、外部ツールの 7-Zip を使う方法を中心に、実務で詰まりやすい上書き、除外、パスのスペース、エラー処理までまとめます。

先に結論

  • 追加インストールなしで済ませるなら Compress-Archive
  • 大量ファイル、高速化、細かい除外指定まで考えるなら 7z.exe
  • 既存ZIPの上書きは、先に削除してから作り直すと事故が少ない
  • 自動実行するなら ERRORLEVEL を見て失敗時に止める
スポンサーリンク

最短でZIP圧縮するコマンド

まずは最短形です。PowerShellの Compress-Archive をバッチファイルから呼び出します。

zip-simple.bat
@echo off
setlocal

set "SRC=C:\work\source"
set "ZIP=C:\work\backup.zip"

powershell -NoProfile -ExecutionPolicy Bypass -Command "Compress-Archive -Path '%SRC%\*' -DestinationPath '%ZIP%'"

echo ZIP圧縮が完了しました: %ZIP%
endlocal

%SRC%\* と書くと、フォルダ自体ではなくフォルダ内のファイルをZIPに入れます。フォルダ名ごとZIPに含めたい場合は %SRC% を指定します。

PowerShellでZIP圧縮する基本形

自動処理に使うなら、圧縮に失敗したときの判定まで入れておくのが大事です。PowerShell側で例外を拾って exit 1 を返すようにすると、バッチ側の ERRORLEVEL で失敗を検知できます。

zip-powershell.bat
@echo off
setlocal

set "SRC=C:\work\source"
set "ZIP=C:\work\backup.zip"

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "try { Compress-Archive -Path '%SRC%\*' -DestinationPath '%ZIP%' -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }"

if errorlevel 1 (
    echo [ERROR] ZIP圧縮に失敗しました。
    exit /b 1
)

echo [OK] ZIP圧縮が完了しました: %ZIP%
endlocal

バッチからPowerShellを呼び出す基本は、PowerShellをバッチファイルから呼び出す方法でも詳しく整理しています。

既存ZIPを上書きする

同じZIPファイル名で何度も作り直す場合は、既存ZIPを削除してから作成すると動きが読みやすくなります。-Update で追記する方法もありますが、バックアップ用途では古いファイルが残ることがあるため、作り直しのほうが安全です。

zip-overwrite.bat
@echo off
setlocal

set "SRC=C:\work\source"
set "ZIP=C:\work\backup.zip"

if exist "%ZIP%" (
    del /f /q "%ZIP%"
)

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "try { Compress-Archive -Path '%SRC%\*' -DestinationPath '%ZIP%' -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }"

if errorlevel 1 (
    echo [ERROR] ZIP圧縮に失敗しました。
    exit /b 1
)

echo [OK] ZIPを作成しました: %ZIP%
endlocal

日付付きのZIPファイル名にする

バックアップ用途では、毎回同じ名前ではなく日付付きファイル名にすると履歴を残せます。日付の扱いは環境によって表示形式が違うことがあるため、安定させたい場合はPowerShellでyyyyMMdd を作るのがおすすめです。

zip-with-date.bat
@echo off
setlocal

set "SRC=C:\work\source"
set "OUT_DIR=C:\work\backup"

if not exist "%OUT_DIR%" mkdir "%OUT_DIR%"

for /f %%D in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"') do set "TODAY=%%D"
set "ZIP=%OUT_DIR%\backup_%TODAY%.zip"

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "try { Compress-Archive -Path '%SRC%\*' -DestinationPath '%ZIP%' -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }"

if errorlevel 1 (
    echo [ERROR] ZIP圧縮に失敗しました。
    exit /b 1
)

echo [OK] %ZIP%
endlocal

%DATE% から切り出す方法もありますが、PCの地域設定に左右されます。詳しくは 日付と時間をファイル名に挿入する方法 も参考になります。

ログを残してZIP圧縮する

タスクスケジューラなどで無人実行する場合は、画面に表示するだけでなくログファイルに残すと調査しやすくなります。

zip-with-log.bat
@echo off
setlocal

set "SRC=C:\work\source"
set "OUT_DIR=C:\work\backup"
set "LOG_DIR=C:\work\logs"

if not exist "%OUT_DIR%" mkdir "%OUT_DIR%"
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

for /f %%D in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"') do set "TODAY=%%D"
set "ZIP=%OUT_DIR%\backup_%TODAY%.zip"
set "LOG=%LOG_DIR%\zip_%TODAY%.log"

echo [%DATE% %TIME%] ZIP圧縮開始 >> "%LOG%"

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "try { Compress-Archive -Path '%SRC%\*' -DestinationPath '%ZIP%' -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }" >> "%LOG%" 2>&1

if errorlevel 1 (
    echo [%DATE% %TIME%] ERROR ZIP圧縮失敗 >> "%LOG%"
    exit /b 1
)

echo [%DATE% %TIME%] OK ZIP圧縮完了: %ZIP% >> "%LOG%"
endlocal

ログ出力の考え方は バッチファイルでログを出力する方法 にもつなげられます。

特定ファイルを除外してZIP圧縮する

Compress-Archive だけで複雑な除外条件を書くと読みにくくなります。実務では一時フォルダへ必要なファイルだけコピーしてからZIP化する方法が堅実です。

zip-exclude-temp.bat
@echo off
setlocal

set "SRC=C:\work\source"
set "TEMP_DIR=%TEMP%\zip_work_%RANDOM%"
set "ZIP=C:\work\backup.zip"

mkdir "%TEMP_DIR%"

rem *.tmp と log フォルダを除外してコピー
robocopy "%SRC%" "%TEMP_DIR%" /E /XF *.tmp /XD log

if errorlevel 8 (
    echo [ERROR] ファイルコピーに失敗しました。
    rmdir /s /q "%TEMP_DIR%"
    exit /b 1
)

if exist "%ZIP%" del /f /q "%ZIP%"

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "try { Compress-Archive -Path '%TEMP_DIR%\*' -DestinationPath '%ZIP%' -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }"

set "RESULT=%ERRORLEVEL%"
rmdir /s /q "%TEMP_DIR%"

if not "%RESULT%"=="0" (
    echo [ERROR] ZIP圧縮に失敗しました。
    exit /b 1
)

echo [OK] ZIPを作成しました: %ZIP%
endlocal

7-ZipでZIP圧縮する

7-Zipを使うと、大量ファイルの圧縮、パスワード付きZIP、細かい除外指定などが扱いやすくなります。インストール済みの 7z.exe をバッチから呼び出します。

zip-7zip.bat
@echo off
setlocal

set "SEVENZIP=C:\Program Files\7-Zip\7z.exe"
set "SRC=C:\work\source"
set "ZIP=C:\work\backup.zip"

if not exist "%SEVENZIP%" (
    echo [ERROR] 7z.exe が見つかりません: %SEVENZIP%
    exit /b 1
)

if exist "%ZIP%" del /f /q "%ZIP%"

"%SEVENZIP%" a -tzip "%ZIP%" "%SRC%\*" -mx=5

if errorlevel 1 (
    echo [ERROR] 7-ZipでのZIP圧縮に失敗しました。
    exit /b 1
)

echo [OK] ZIP圧縮が完了しました: %ZIP%
endlocal
オプション 意味
a アーカイブに追加する
-tzip ZIP形式で作成する
-mx=5 圧縮レベル。1は速い、9は高圧縮
-x! 除外指定に使う
-p パスワードを指定する

7-Zipでファイルを除外する

7-Zipでは -x! を使って除外できます。ログや一時ファイルをZIPに入れたくない場合に便利です。

zip-7zip-exclude.bat
@echo off
setlocal

set "SEVENZIP=C:\Program Files\7-Zip\7z.exe"
set "SRC=C:\work\source"
set "ZIP=C:\work\backup.zip"

"%SEVENZIP%" a -tzip "%ZIP%" "%SRC%\*" -xr!*.tmp -xr!log\* -mx=5

if errorlevel 1 (
    echo [ERROR] ZIP圧縮に失敗しました。
    exit /b 1
)

echo [OK] ZIPを作成しました。
endlocal

パスワード付きZIPを作る場合

Windows標準の Compress-Archive はパスワード付きZIPの作成に向きません。パスワード付きZIPが必要な場合は7-Zipを使います。詳しくは パスワード付きZIPを自動生成するバッチファイル で解説しています。

zip-7zip-password.bat
@echo off
setlocal

set "SEVENZIP=C:\Program Files\7-Zip\7z.exe"
set "SRC=C:\work\source"
set "ZIP=C:\work\secure.zip"
set "PASS=your_password"

"%SEVENZIP%" a -tzip "%ZIP%" "%SRC%\*" -p"%PASS%" -mem=AES256

if errorlevel 1 (
    echo [ERROR] パスワード付きZIPの作成に失敗しました。
    exit /b 1
)

echo [OK] パスワード付きZIPを作成しました。
endlocal
注意: パスワードをバッチファイルに直接書くと、ファイルを見られた時点で漏れます。共有端末やGit管理下のスクリプトでは、環境変数や別ファイルで管理してください。

パスにスペースがある場合

C:\Program FilesC:\my work のようにパスへスペースが含まれる場合は、必ずダブルクォートで囲みます。これはZIP圧縮に限らず、バッチファイル全体の基本です。

zip-space-path.bat
@echo off
setlocal

set "SRC=C:\my work\source folder"
set "ZIP=C:\my work\backup file.zip"

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "try { Compress-Archive -Path '%SRC%\*' -DestinationPath '%ZIP%' -ErrorAction Stop; exit 0 } catch { Write-Error $_; exit 1 }"

if errorlevel 1 exit /b 1
endlocal

スペースを含むパスで詰まりやすい場合は、パスにスペースがある時のエラー対処 も確認してください。

ZIP圧縮と解凍をセットで考える

圧縮処理を作ったら、復元できるかも確認しておきましょう。バックアップは作ることより、必要なときに戻せることが重要です。ZIP解凍側は バッチファイルでZIPファイルを解凍する方法 にまとめています。

よくある失敗と対処

症状 原因 対処
ZIPが作成されない 出力先フォルダがない、権限がない mkdirERRORLEVEL を入れる
既存ZIPが残る 同名ファイルを作り直していない 事前に del /f /q で削除する
パスが途中で切れる スペース入りパスを囲んでいない 変数代入とコマンド実行の両方でクォートする
不要なログまで入る 除外条件がない 一時フォルダ方式か7-Zipの -x! を使う
無人実行で失敗に気づけない 終了コードやログを見ていない ERRORLEVEL とログ出力を追加する

まとめ

バッチファイルでZIP圧縮するなら、まずはWindows標準の Compress-Archive で十分です。ただし、除外条件が複雑な場合やパスワード付きZIPが必要な場合は、7-Zipを使うほうが扱いやすくなります。

運用に入れる場合は、日付付きファイル名、既存ZIPの扱い、ログ出力、エラー処理まで入れておくと、あとで原因を追いやすくなります。自動バックアップ用途なら、バッチファイルで自動バックアップを作成する方法 と組み合わせると実務に落とし込みやすいです。