PowerShellのCompress-ArchiveコマンドZIP圧縮をするときにサイズが大きいファイルを圧縮しようとしたときにエラーになったことがありませんか?
Compress-Archiveコマンドには制約があります。
本記事では、Compress-Archiveの限界を解説しつつ、PowerShell v5だけで大容量ZIPを扱うための実用的な手法を紹介します。
PowerShellだけで大容量ZIPは作れるのか?
PowerShellの「Compress-Archive」は便利なコマンドレットですが、2GBを超えるZIPファイルの作成時には、予期しないエラーが発生することがあります。
よくあるエラー例
"3" 個の引数を指定して "Write" を呼び出し中に例外が発生しました: "ストリームが長すぎます。"
このようなエラーが出る理由は、Compress-Archiveの内部的な制約にあります。
Compress-Archiveの制約とは?
- ファイルサイズが約2GBを超えるとエラーになる
- ZIP64に対応していない
- 大容量ファイルや大量ファイルでは失敗しやすい
そのため、Compress-Archiveは「中~大容量ファイル」の圧縮には不向きです。
代替策:.NETのZipFileクラスを使う方法
PowerShell v5では、.NET FrameworkのZipFileクラスを使うことで、外部ツールなしでZIP64対応の圧縮が可能です。
サンプルスクリプト
$sourceDir = "C:\Data\LargeFolder"
$zipFile = "C:\Backup\LargeArchive.zip"
Add-Type -AssemblyName System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory(
$sourceDir,
$zipFile,
[IO.Compression.CompressionLevel]::Optimal,
$false
)
Write-Host "圧縮完了:$zipFile"
この方法では、2GBを超えるZIPファイルも正常に作成できる可能性が高いです。
実験:計4.5GBのZIPを作成してみた
1GB~2GBのダミーファイル×3(動画ファイル、計4.5GB)をフォルダに用意して、上記スクリプトでZIP化。問題なく圧縮・展開できました!
このダミーファイルたちはCompress-Archiveコマンドで圧縮を実行しようとすると
「”3″ 個の引数を指定して “Write” を呼び出し中に例外が発生しました: “ストリームが長すぎます。”」
エラーが出てしまったものです。
ポイント:ZipFileはZIP64に暗黙対応しているため、オプション指定は不要です。
注意点とベストプラクティス
- 4GBを超えるファイルを含む場合は事前検証が必要
- 圧縮中はファイルを他のアプリが使用していないことを確認
- 作成したZIPが古い解凍ツールで開けない場合がある
解凍スクリプト(展開)
$zipFile = "C:\Backup\LargeArchive.zip"
$extractPath = "C:\Restore"
[IO.Compression.ZipFile]::ExtractToDirectory($zipFile, $extractPath)
Compress-Archiveとの使い分け
| 用途 | 推奨方法 |
|---|---|
| 小容量ファイルの圧縮 | Compress-Archive |
| 2GB超のフォルダ圧縮 | ZipFile.CreateFromDirectory |
| 巨大ファイル・分割圧縮 | 7-Zipなど外部ツール |
まとめ
PowerShell v5だけでも、.NETのZipFileクラスを使えば、2GB以上のZIPファイルを作成できます。
Compress-Archiveがエラーを出すような大容量ケースでは、代替手段として非常に有効です。
実用的な自動化やバックアップの一部として、ぜひこの方法を活用してください。

コメント