次の例は、.NET Framework 4.5 を使用してファイルを圧縮するソリューションとして、インターネットおよびこの Web サイトで追跡可能です新しい zip ファイルを作成します。
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$src_folder = "D:\stuff"
$destfile = "D:\stuff.zip"
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$includebasedir = $false
[System.IO.Compression.ZipFile]::CreateFromDirectory($src_folder,$destfile,$compressionLevel, $includebasedir )
[System.IO.Compression.ZipFileExtensions] は既に試しましたが、既存のアーカイブにファイルを追加できますが、ファイルを個別に追加するだけで、フォルダーやワイルドカードは許可されません。
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$src_folder = "D:\stuff" #also tried D:\stuff\ or D:stuff\*
$destfile = "D:\stuff.zip"
$destfile2=[System.IO.Compression.ZipFile]::Open($destfile, "Update")
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destfile2,$src_folder,"\",$compressionlevel)
$archiver.Dispose()
ファイルを個別に処理するスクリプトを作成しましたが、同じアーカイブ内の数千を超えるファイルを処理するには長い時間がかかるため、質問: 既存の zip アーカイブに完全なフォルダーを追加する方法はありますか?一気に?
ところで、System.IO.Compression.ZipFile の速さに驚いています。
Noamの答えを見た後、それがいかに簡単であるかに気づき、次のように問題を解決しました:
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$src_folder = "D:\stuff\"
$destfile = "D:\stuff.zip"
$destfile2=[System.IO.Compression.ZipFile]::Open($destfile, "Update")
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$in = Get-ChildItem $src_folder -Recurse | where {!$_.PsisContainer}| select -expand fullName
[array]$files = $in
ForEach ($file In $files)
{
$file2 = $file #whatever you want to call it in the zip
$null = [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destfile2,$file,$file2,$compressionlevel)
}
$archiver.Dispose()