Powershell 圧縮
Comでshell にzipファイルを渡してCopyHere($filename)
注意点は、非同期処理対応。 重複試験はhashかなぁ。
なお、圧縮パスワードは設定できない。 解凍パスワードは、引数指定不可、ダイアログが表示される。
下記では、全ファイルをCopyHereに渡した後に圧縮待ちを入れた。
圧縮
$zip = "C:\a.zip" $src = "C:\tmp" # zip削除 if(Test-Path -Path $zip){ Remove-Item -Path $zip } # zip作成 "PK"+ [char]5 + [char]6 + ("$([char]0)"*18) | ` New-Item -Path $zip -Type File # shell作成 $shell = New-Object -comObject Shell.Application $folder = $shell.NameSpace($zip) # hash $hash = @{} $num=0 foreach($el in ($src | %{Get-Item $_})){ if ( $hash.ContainsKey($el) ){continue} $hash[$el] = $true $num++ $folder.CopyHere($el.FullName) } # wait untill zip complete while($true){ if( $num -le $folder.Items().Count ){break} Start-Sleep -milliseconds 500 } return $hash.Keys
解凍1
comのshellを使う。comリリースも忘れずに。
$file = "D:\Desktop\test.zip" $shell = New-Object -ComObject shell.application $zip = $shell.NameSpace($file) $dest = $shell.NameSpace((Split-Path $file -Parent)) $dest.CopyHere($zip.Items()) $zip = $null ; $dest=$null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) Remove-Variable shell
解凍2
解凍は少し簡単
function psunzip { #エクスプローラーのオブジェクトを作成する $Expcom = New-Object -ComObject Shell.Application #第一引数のzipファイルパスを登録 $zipFile = $Expcom.NameSpace($args[0]) #第二引数の出力先ディレクトリパスを登録 $tgtDir = $Expcom.NameSpace($args[1]) #zipファイル内のオブジェクト(ファイル)一覧を取得してForEach-Objectに渡す $zipFile.Items() | ForEach-Object { #ファイルを一つずつ出力先ディレクトリにコピー $tgtDir.CopyHere($_.path) } }
参考
COM http://memo-space.blogspot.jp/2010/01/powershellzip.html?m=1
少しスマート http://www.casleyconsulting.co.jp/blog-engineer/windows-powershell/windows-powershellを使ってデータファイルを圧縮するバッチを/
解凍1
http://mtgpowershell.blogspot.jp/2011/02/zip.html?m=1
解凍2
http://qiita.com/kmr_hryk/items/5dfe87c0035887cbd8e4
7zip
https://sevenzip.osdn.jp/howto/dos-command-password.html
PSから7zip使用
http://qiita.com/arachan@github/items/1147915cd0bcc011872f
wsh
http://bitdatasci.blogspot.jp/2015/10/windowsoszipwsh.html?m=1
shellオブジェクト
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shell.htm
shell.namespace($folder)が使える。
folderオブジェクト
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shellfol.htm
使えるメソッド
- CopyHere(path|FolderItem|FolderItems, vOptions)
- MoveHere(同上)
- Items()
- ParseName(string)
Property
- ParentFolder
- Title
FolderItems
- Item(#)
- Count
vOptions
定数名と値 意味
Const FOF_ALLOWUNDO = &H40 エクスプローラで「編集」→「元に戻す」コマンドで操作を取り消せるようになる。 Const FOF_CONFIRMMOUSE = &H2 (未使用) Const FOF_FILESONLY = &H80 ワイルドカードを指定したとき(*.*)、フォルダを対象外にする。 Const FOF_MULTIDESTFILES = &H1 ? Const FOF_NOCONFIRMATION = &H10 上書き確認などのダイアログが表示されなくなる。 Const FOF_NOCONFIRMMKDIR = &H200 フォルダを作成する確認ダイアログが表示されなくなる。 Const FOF_RENAMEONCOLLISION = &H8 コピーや移動先に同名のファイルが存在する場合、"コピー ~ filename.ext"のように、リネームする。 Const FOF_SILENT = &H4 経過ダイアログが表示されなくなる。 Const FOF_SIMPLEPROGRESS = &H100 ファイル名の表示されない、シンプルな経過ダイアログが表示される。 Const FOF_WANTMAPPINGHANDLE = &H20 ?
参考
vb版
http://bitdatasci.blogspot.jp/2015/10/windowsoszipwsh.html?m=1