none
powershellによる大容量データのzip圧縮について RRS feed

  • 質問

  • powershellにて、以下サンプルソースのような開発をしたのですが、
    大容量ファイルを圧縮した場合、まだ一個目のファイルの圧縮が完了していない段階で、
    次の圧縮に進んでしまう現象が発生しました。

    そこでスリープ時間を、100秒など長くするとうまく行ったのですが、
    複数ファイルがある場合、必ず100秒×ファイル数分待つ必要が出てしまいます。

    そうではなく、確実に1つ目のファイルのZIP圧縮が終わったことを取得し、
    次に進みたいのですが、そのようなことは可能でしょうか。


      for($answer=[System.Windows.Forms.DialogResult]::Yes;$answer -eq [System.Windows.Forms.DialogResult]::Yes;){
        $zFolderItem=$zFolder.ParseName($File);
        if(-not $zFolderItem){
          $Count=$zFolder.Items().Count;
          $zFolder.CopyHere($sFolderItem);
          while($zFolder.Items().Count -eq $Count){
            Start-sleep -milliseconds 1000;
          }
          break;
        }else{
          $answer = [System.Windows.Forms.MessageBox]::Show("このフォルダには既に次のファイルが存在します:`n`n" + '"' + $File + '"' +"`n`n既存のファイルと置き換えますか?", "ファイル置換の確認", [System.Windows.Forms.MessageBoxButtons]::YesNoCancel, [System.Windows.Forms.MessageBoxIcon]::Question)
          if($answer -eq [System.Windows.Forms.DialogResult]::Yes){$zFolderItem.InvokeVerb("delete");}
        }
      }

    • 移動 星 睦美 2014年8月18日 5:45 SQL Server から
    2014年8月15日 2:45

回答

  • SharpZipLibやDotNetZipなどのzipライブラリDLLを入手して、それをAdd-Type -Pathでロードすれば、それらのライブラリを使って同期的にzipファイルの作成ができるようになりますね。
    2014年8月18日 6:52

すべての返信

  • # オペレーターさんへ、PowerShellフォーラムに移動してください。

    対象としているPowerShellのバージョンはいくつでしょうか? PSVersion 3.0以降の場合、CLRVersion 4系となります。そして.NET Framework 4.5がインストールされている環境では、ZipArchiveクラスなどが使えます。挙げられているコードのようなExplorer経由で操作するのではなく直接Zipファイルを操作できるようになるのでスリープ処理も不要になります。

    2014年8月15日 4:45
  • ご返信、有難うございます。

    >PowerShellフォーラム
     があるのですね。初めて知りました。

    以下、Version情報になります。
    (共有して使用している環境のためVersionUpが出来ない状態です。)

    ・PSVersion 2.0
    ・.NET Framework 3.5

    何かいい方法が御座いますでしょうか?

    2014年8月15日 6:40
  • フォーラム オペレーターの星 睦美です。
    スレッドをWindows PowerShell フォーラムに移動させていただきました。

    ※役立つ回答には、投稿者からの[回答としてマーク] をお願いします。

    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年8月18日 5:50
  • SharpZipLibやDotNetZipなどのzipライブラリDLLを入手して、それをAdd-Type -Pathでロードすれば、それらのライブラリを使って同期的にzipファイルの作成ができるようになりますね。
    2014年8月18日 6:52