qshinoの日記

Powershell関係と徒然なこと

Powershell 圧縮とshellオブジェクト

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