none
CopyHere メソッドを使用したzipファイルの作成について RRS feed

  • 質問

  • お世話になります。Sayakaと申します。

    あるテキストファイルに書いてある複数のファイルを、"Folder.CopyHere メソッド"を使用して
    まとめてZIP化したいです。

    環境はServer 2012 R2でPowershell4.0の為、"Compress-Archive"が使用できないです。

    PS C:\> cat EVTXlist.txt
    \\test\log$\audit_2020-03-10.evtx
    \\test\log$\audit_2020-03-11.evtx
    \\test\log$\audit_2020-03-12.evtx
    \\test\log$\audit_2020-03-13.evtx
    \\test\log$\audit_2020-03-14.evtx


    上記のファイルをまとめて、1つのzipファイル(c:\test\evtx.zip)にしたいです。
    試行錯誤しているのですが、上手くいっていない状況です。

    宜しくお願い致します。
    2020年3月19日 11:39

回答

  • 「$sh = new-object -com shell.application」して…などと始めたいところですが、ReleaseComObject による COM オブジェクトの解放の複雑さや、非同期実行ゆえに扱いにくく、とてもサーバーOS で利用するような手法とは言えません。タスクスケジューラなどからの非対話での無人実行は特に NG です。PowerShell からの呼び出しという事で、過去にこういったやり取りもありましたが……今となっては、バッドノウハウにあたる手法だと思ってください。

    無人実行を前提とするのなら、コマンドライン向けの zip ツールを導入するのが安全で確実です。作業工数も大幅に削減できるでしょう。可能なら PowerShell も更新しておきたいところ。

    どうしても追加のアプリケーションを導入できない事情があるのならば、COM ベースの CopyHere  メソッドを使うのではなく、せめて System.IO.Compression.FileSystem を Add-Type して、ZipFile、ZipArchive クラスを呼び出す方法を検討してみてください。コーディングの手間が発生するという点では  Compress-Archive やコマンドラインツールに劣りますが、それでも  CopyHere に頼るよりは健全な方法です。(Server 2012 R2 であれば、既定で .NET Framework 4.5.1 以上が利用できる環境になっていると思います)

    https://tech.guitarrapc.com/entry/2013/10/07/083837


    2020年3月19日 12:44

すべての返信

  • 「$sh = new-object -com shell.application」して…などと始めたいところですが、ReleaseComObject による COM オブジェクトの解放の複雑さや、非同期実行ゆえに扱いにくく、とてもサーバーOS で利用するような手法とは言えません。タスクスケジューラなどからの非対話での無人実行は特に NG です。PowerShell からの呼び出しという事で、過去にこういったやり取りもありましたが……今となっては、バッドノウハウにあたる手法だと思ってください。

    無人実行を前提とするのなら、コマンドライン向けの zip ツールを導入するのが安全で確実です。作業工数も大幅に削減できるでしょう。可能なら PowerShell も更新しておきたいところ。

    どうしても追加のアプリケーションを導入できない事情があるのならば、COM ベースの CopyHere  メソッドを使うのではなく、せめて System.IO.Compression.FileSystem を Add-Type して、ZipFile、ZipArchive クラスを呼び出す方法を検討してみてください。コーディングの手間が発生するという点では  Compress-Archive やコマンドラインツールに劣りますが、それでも  CopyHere に頼るよりは健全な方法です。(Server 2012 R2 であれば、既定で .NET Framework 4.5.1 以上が利用できる環境になっていると思います)

    https://tech.guitarrapc.com/entry/2013/10/07/083837


    2020年3月19日 12:44
  • GitHubにvbsでCopyHereを使って圧縮して非同期をWMIで監視するスクリプトを公開してくれている方がいるので共有しておきます。

    公開してくれているのはbatから圧縮用のvbsを呼び出す手法ですが、カスタムしてpowershellから呼び出して要件に沿うようにしてはいかがでしょうか。

    https://github.com/gabekore/bat/tree/master/dir_copy_and_zip


    • 編集済み kaz8629 2020年3月20日 6:32
    2020年3月20日 6:31