Windowsコマンドプロンプトで複数のファイルやディレクトリをZIPに圧縮する方法

Windowsのコマンドプロンプト(cmd.exe)から、複数のファイルやディレクトリをZIP形式にまとめる方法を解説します。使うのはPowerShellのCompress-Archiveです。CMDの組み込みコマンドではないため、CMDからはPowerShellを呼び出す必要があります。ファイル共有や保存用のコピーに便利ですが、隠しファイルなどの制限があるので、完全なバックアップの代わりとして無条件に使わないでください。

目次

使用するコマンド:Compress-Archive

この記事ではWindows PowerShell 5.1のCompress-Archiveを使います。以下では「CMDで実行」と「PowerShellで実行」を区別します。Microsoftのコマンド仕様も参照してください。例のC:\ZipDemo\Sourceは入力用フォルダー、C:\ZipDemo\Archivesは出力用フォルダーです。自分が読み書きできる場所に用意し、実際のパスへ置き換えてください。出力用フォルダーは入力用フォルダーの外に置きます。

基本的な使用方法

CMDで実行する場合は、powershell.exe -NoProfile -Commandに続けて、PowerShellに渡すコマンド全体を二重引用符で囲みます。コマンド内のパスには単一引用符を使います。-NoProfileはPowerShellのプロファイルを読み込まない指定です。

powershell.exe -NoProfile -Command "Compress-Archive -Path 'C:\ZipDemo\Source\*' -DestinationPath 'C:\ZipDemo\Archives\Backup.zip' -ErrorAction Stop"

PowerShellを直接開いている場合は、次のようにコマンドレットから入力します。上のCMD例と同じ処理なので、どちらか一方を実行してください。既存のBackup.zipを残したい場合は、新しい出力名を指定します。

Compress-Archive -Path 'C:\ZipDemo\Source\*' -DestinationPath 'C:\ZipDemo\Archives\Backup.zip' -ErrorAction Stop

Source\*では、Source自身を含めず、その配下のファイルとサブフォルダーをまとめます。-Path 'C:\ZipDemo\Source'とすると、Source自身もZIP内に含まれます。隠しファイルなどの制限は後述します。

複数のファイルやフォルダーを指定するなら、PowerShellでパスをカンマで区切ります。次の例はreport.txtとImagesフォルダーをまとめます。-LiteralPathは[などをワイルドカードとして解釈しない指定で、*による選択には使いません。

Compress-Archive -LiteralPath 'C:\ZipDemo\Source\report.txt', 'C:\ZipDemo\Source\Images' -DestinationPath 'C:\ZipDemo\Archives\Selected.zip' -ErrorAction Stop

オプションの使用

Compress-Archiveには、操作をカスタマイズするためのいくつかのオプションがあります。

  • -Update: 既存のZIPにファイルを追加し、同じ名前の古いファイルを新しいものへ更新します。元データから削除したファイルをZIPからも削除する同期用オプションではありません。
  • -CompressionLevel: 圧縮のレベルを指定します(Optimal、Fastest、NoCompression)。
  • -Force: 出力先の既存ZIPを上書きします。追記ではありません。元のZIPを残す必要がある場合は、付けずに別の出力名を使ってください。-Updateとは併用しません。

例:先ほどのBackup.zipに、同じ入力指定で追加・更新する場合は、PowerShellで次を実行します。フォルダー自身を含めるかどうかを作成時とそろえ、ZIP内の階層が変わらないようにしてください。

Compress-Archive -Path 'C:\ZipDemo\Source\*' -DestinationPath 'C:\ZipDemo\Archives\Backup.zip' -CompressionLevel Optimal -Update -ErrorAction Stop

ZIPを新規作成する操作、既存ZIPの更新、既存ZIPの上書きを分けて考えましょう。CMDから呼び出す書式はpowershell.exeの公式説明で確認できます。

WindowsコマンドプロンプトでZIP圧縮する具体的な手順

WindowsコマンドプロンプトやPowerShellを使用してファイルやディレクトリをZIP形式で圧縮する具体的な手順を解説します。この方法を利用することで、ファイルの整理、共有、保存スペースの削減などを効率的に実行できます。

コマンドプロンプトでの操作手順

まず、コマンドプロンプトを開きます。Windowsキー + Rを押して「Run」ダイアログを開き、「cmd」と入力してEnterキーを押すことでコマンドプロンプトを起動できます。

1. PowerShellを起動する

ここからの手順では、CMDの中で対話型のPowerShellを起動します。CMDで次を入力してください。すでにPowerShellを開いている場合は、この起動操作は不要です。

powershell.exe -NoProfile

2. 圧縮するファイルまたはフォルダーを指定する

プロンプトがPS C:\…>のようになったら、以降はPowerShellのコマンドを入力できます。ここではDocumentsという入力用フォルダーの中身をまとめます。C:\ZipDemo\Documentsと、別の出力用フォルダーC:\ZipDemo\Archivesを準備してから実行してください。

Compress-Archive -Path 'C:\ZipDemo\Documents\*' -DestinationPath 'C:\ZipDemo\Archives\MyDocuments.zip' -ErrorAction Stop

この例ではDocumentsの中身をMyDocuments.zipとしてまとめます。ZIPを入力用フォルダーの外に置くことで、次回の圧縮時に過去のZIPまで入力として選択してしまう事故を避けやすくなります。

3. 圧縮ファイルの保存先を指定する

-DestinationPathにはフォルダーだけでなく、MyDocuments.zipのようなファイル名まで指定します。保存先フォルダーへの書き込み権限と空き容量を確認してください。入力と出力のパスを引用符で囲み、空白を含むパスでも一つの引数として渡します。

4. 圧縮のオプションを選択する

次の指定は単独で実行するコマンドではありません。Compress-Archiveのコマンド末尾に付けるオプションです。

  • 圧縮レベルを最適化する場合:
-CompressionLevel Optimal
  • 既存のZIPファイルにファイルを追加する場合:
-Update

処理後はZIPを開き、必要なファイルと階層が入っているか確認します。起動したPowerShellを終了してCMDへ戻るときはexitを入力してください。エラーが出た場合は、途中までできたZIPを完成済みのバックアップとして扱わないでください。

Windowsコマンドプロンプトでの応用例:特定の条件にマッチするファイルのZIP圧縮

大量のファイルや特定の拡張子を持つファイルだけを選択的に圧縮する方法は、日常的なファイル管理において非常に便利です。このセクションでは、Windowsコマンドプロンプトを使用して、これらの応用的なZIP圧縮を実行する方法を紹介します。

特定の拡張子のファイルだけを圧縮する

CMDで実行する例です。Source直下の.txtファイルをTextFiles.zipにまとめます。例は*.txtに一致するフォルダーがない通常のファイル配置を想定しています。

powershell.exe -NoProfile -Command "Compress-Archive -Path 'C:\ZipDemo\Source\*.txt' -DestinationPath 'C:\ZipDemo\Archives\TextFiles.zip' -ErrorAction Stop"

この指定は、サブフォルダー内の.txtまで再帰的に探すものではありません。階層をまたぐファイルの選別には、次のようにGet-ChildItemを使います。

複数の条件を使用してファイルを選択する

以下はPowerShellで実行する例です。Photos配下から2023年1月1日以降に作成された.jpgファイルを選びます。CreationTimeはファイルの作成日時であり、写真の撮影日時(EXIF)ではありません。対象がゼロ件の場合と、別フォルダーに同名ファイルがある場合は、圧縮せずに止めます。日付は必要な条件に置き換えてください。

$files = @(
    Get-ChildItem -LiteralPath 'C:\ZipDemo\Photos' -Filter '*.jpg' -File -Recurse -ErrorAction Stop |
        Where-Object { $_.Extension -ieq '.jpg' -and $_.CreationTime -ge [datetime]'2023-01-01' }
)
if ($files.Count -eq 0) {
    throw '条件に一致するファイルがありません。'
}
$duplicates = @($files | Group-Object -Property Name | Where-Object { $_.Count -gt 1 })
if ($duplicates.Count -gt 0) {
    throw '同名ファイルがあります。対象を見直すか、フォルダーごと圧縮してください。'
}
Compress-Archive -LiteralPath $files.FullName -DestinationPath 'C:\ZipDemo\Archives\RecentPhotos.zip' -ErrorAction Stop

個々のファイルを渡すこの方法では、元の親フォルダーの階層は保存されず、ファイルがZIPの直下にまとまります。階層を保ちたい場合は、次のフォルダー単位の圧縮を使ってください。-Fileによりフォルダー自体を検索結果から除き、-RecurseはGet-ChildItem側にだけ指定しています。詳しくはGet-ChildItemの公式説明を参照してください。

この複数行の例を、そのままCMDへ貼り付けないでください。CMDでは|も特別な意味を持つため、単に先頭にpowershellを足すだけでは、後続のパイプラインを正しく渡せません。複雑な条件は、前述の手順でPowerShellを開いて実行する方が分かりやすくなります。

大量のファイルを効率的に圧縮する

Compress-Archiveに-Recurseパラメーターはありません。サブフォルダーを含む入力フォルダー全体をまとめるなら、そのフォルダーを直接指定します。次はCMDで実行する例で、Source自身を含めた階層で圧縮します。ファイル数が多ければ時間もかかるので、完了と内容を確認してください。

powershell.exe -NoProfile -Command "Compress-Archive -LiteralPath 'C:\ZipDemo\Source' -DestinationPath 'C:\ZipDemo\Archives\FolderArchive.zip' -ErrorAction Stop"

これらの応用例を活用することで、WindowsコマンドプロンプトとPowerShellの強力な組み合わせを通じて、ファイルの管理と圧縮をより柔軟に、かつ効率的に行うことができます。

WindowsコマンドプロンプトでのZIP圧縮:注意点

WindowsコマンドプロンプトからZIPを作成する場合も、実際に処理するPowerShellの制限が適用されます。特に、元ファイルを削除する前やバックアップとして保管する前に、必要な内容が含まれているか確認してください。

隠しファイルと大きなファイルに注意する

MicrosoftのCompress-Archiveの説明では、作成・更新時に隠しファイルと隠しフォルダーが無視され、処理対象のファイルサイズには2GBの制限があるとされています。ZIP全体の容量だけを見て判断しないでください。-Forceを付けても隠しファイルを含める指定にはなりません。隠し項目を含める必要がある場合や大容量ファイルを扱う場合は、このコマンドだけで完結すると考えず、要件に合う別の方法を確認してください。

ファイルパスの長さに注意する

長いパスの扱いはWindowsの設定と使用するアプリケーションに依存します。従来のMAX_PATHは260文字ですが、すべての環境が一律に260文字までとは限りません。Microsoftの長いパスの説明では、対応にはアプリケーション側の条件もあるとされています。問題が出たら、まず自分の作業用コピーを短いパスに置いて切り分け、設定を変えるだけで必ず解決すると考えないでください。

権限の確認

入力ファイルの読み取り権限と、出力先フォルダーの書き込み権限を確認してください。通常の自分のファイルを圧縮するために、最初から管理者として起動する必要はありません。アクセス拒否が出たら対象と保存先を見直し、権限をむやみに変更しないでください。

ファイルのロック状態を確認する

他のアプリケーションによって使用中のファイルは、開き方によっては読み取れないことがあります。保存中のファイルをそのまま圧縮するのではなく、保存を完了してから、必要に応じて使用中のアプリケーションを閉じて再実行してください。実行中に内容が変わるデータの整合性まで、通常のZIP作成が保証するわけではありません。

展開して内容を確認する

必要なら、PowerShellで別の確認用フォルダーに展開します。次の例は、まだ存在しないC:\ZipDemo\VerifyBackupを確認用の保存先にする想定です。元データと同じ場所へ展開しないでください。

Expand-Archive -LiteralPath 'C:\ZipDemo\Archives\Backup.zip' -DestinationPath 'C:\ZipDemo\VerifyBackup' -ErrorAction Stop

Expand-Archiveは既定では既存ファイルを上書きしません。-Forceは展開先の既存ファイルを上書きするため、内容確認の例には付けていません。展開できたことに加え、必要なファイル数・名前・階層・中身を確認してください。

まとめ

CMDからZIP圧縮する基本は、powershell.exe -NoProfile -CommandでPowerShellの処理を呼び出すことです。PowerShellを直接使う場合とは書式を分け、入力と出力の場所、フォルダーを含める階層、-Updateと-Forceの違いを確認しましょう。隠し項目や大容量ファイルの制限を踏まえ、完成したZIPの内容を確かめてから共有・保管してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次