2012-03-05 11 views
0

ビルドプロセスでは、ComponentA-1.2.3.4.zipなどの.zipファイルが多数作成されます。ここで1.2.3.4はビルド番号です。このファイルには、フォルダ構造内に実際の成果物があるフォルダComponentA-1.2.3.4が含まれています。私はアーティファクトを抽出してサーバーに送り、展開し、サーバー上の最上位のものの下に構造を置く必要のあるPowerShellスクリプトを作成しています。だから、この構造を仮定すると:ComponentA-1.2.3.4.zip\ComponentA-1.2.3.4\{Web,Lib,Bin}、Web、LibとBinのフォルダを抽出する必要があります。zipファイル内のディレクトリからファイルをコピーする

は私が$zipPackage.Items()オブジェクトを操作するが、ファイルがexisingないに関するエラーを取得しようとした

$shellApplication = new-object -com shell.application 
$zipPackage = $shellApplication.NameSpace($zipfilename) 
$destinationFolder = $shellApplication.NameSpace($destination) 
$destinationFolder.CopyHere($zipPackage.Items()) 

現時点では、この方法を使用してファイルをコピーしています。オブジェクトは、デバッガで次のようになります。私はCannot find path 'D:\release\1.2.3.4\System.__ComObject' because it does not existにつながるん

>>> $ZipPackage.Items() 

Application : System.__ComObject 
Parent  : System.__ComObject 
Name   : ComponentA-1.2.3.4 
Path   : D:\Release\1.2.3.4\ComponentA-1.2.3.4.zip\ComponentA-1.2.3.4 
GetLink  : 
GetFolder : System.__ComObject 
IsLink  : False 
IsFolder  : True 
IsFileSystem : False 
IsBrowsable : False 
ModifyDate : 2012-02-27 17:30:34 
Size   : 0 
Type   : File Folder 

何でも。

一時的な場所にファイルを展開してワンステップを歩いてもらう必要はありませんが、その方法はわかりません。

答えて

0

このタスクではDotNetZipなどのZIPライブラリを使用することを検討しましたか?

http://dotnetzip.codeplex.com/

+0

私は7zipをを呼び出してしまった - いくつかの(抽出性能が最悪だっ判明kB/sec)を使用して測定した。 – carlpett

2

あなたはzipファイル内の親フォルダの名前を知っている場合は、代わりに名前を付け、シェルCOMオブジェクトを与えることができます。だからあなたの場合には、何かのように:あなたはそのルートの個々のサブフォルダを取得することができます()$ zipRoot.Itemsを呼び出すときに今

$zipRoot = $shellApplication.NameSpace('ComponentA-1.2.3.4.zip\ComponentA-1.2.3.4') 

、。あなたは、zipファイル内のルートの名前を親ジップObjecttoクエリを使用して、このルートパスの生成を半自動化することができます:

$shellApplication = new-object -com shell.application 
$zipPackage = $shellApplication.NameSpace($zipfilename) 
$zipRoot = $shellApplication.NameSpace(($zipPackage.Items() | select -ExpandProperty Path) 
関連する問題