トップ回答者
CopyHere メソッドを使用したzipファイルの作成について

質問
-
お世話になります。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)にしたいです。
試行錯誤しているのですが、上手くいっていない状況です。
宜しくお願い致します。
回答
-
「$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
- 編集済み 魔界の仮面弁士MVP 2020年3月19日 22:47
- 回答としてマーク ikeda-19 2020年3月22日 6:07
すべての返信
-
「$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
- 編集済み 魔界の仮面弁士MVP 2020年3月19日 22:47
- 回答としてマーク ikeda-19 2020年3月22日 6:07