以前作ったサンプルは非同期に対応できず今ひとつだった。
(それでも今毎日動かしてはいるが)
ケースによってはもう少しまっとうに動く奴が欲しかったりするので、またちょっと調べてみたところ、SharpZipLibを使ったパターンが結構目に付く。
そこで、このdllを使ったスクリプトを試して見た。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 | #ex. dir *.txt | New-ZipFile.ps1 c:\temp\temp.zip param( $zipPath = "D:\Desktop\temp.zip" ) $libName = "ICSharpCode.SharpZipLib" $namespace = "$libName.Zip.{0}" $dllPath = Join-Path (Split-Path $myInvocation.MyCommand.path) "$libName.dll" [Void][Reflection.Assembly]::LoadFile($dllPath) $zipFile = New-Object ($namespace -f "ZipOutputStream") ([IO.File]::Create($zipPath)) [byte[]] $buffer = New-Object byte[] 4096 $input | ?{$_ -is [IO.FileInfo]} | %{ $zipEntry = New-Object ($namespace -f "ZipEntry") $_.name $zipFile.PutNextEntry($zipEntry) $_.fullname $fileStream = [IO.File]::OpenRead($_.FullName) [ICSharpCode.SharpZipLib.Core.StreamUtils]::Copy( $fileStream,$zipFile,$buffer) $fileStream.Close() } $zipFile.close() |
dllはスクリプトと同じ場所にある前提。
とりあえずはファイルだけを対象にしている。
ちょっと試した感じでは良さそうだが、前回のこともあるので色々テストする必要はありそうだ。
--追記
SharpZipLibにはFastZipという簡易的なクラスも用意されているようなので、そのサンプルも載せておく。
001 002 003 004 005 006 007 008 009 | #◆圧縮 $targetPath = "F:\Desktop\comp" $outZipFile = "F:\Desktop\comp.zip" $dllPath = "F:\Desktop\ICSharpCode.SharpZipLib.dll" [Void][Reflection.Assembly]::LoadFile($dllPath) $zipFile = New-Object ICSharpCode.SharpZipLib.Zip.FastZip $zipFile.CreateEmptyDirectories = $true $zipFile.CreateZip($outZipFile,$targetPath,$true,$null,$null) |
0 件のコメント:
コメントを投稿