2012-03-05 3 views
0

Наш процесс сборки приводит к набору .zip-файлов, таких как ComponentA-1.2.3.4.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-файл

Я копирую файлы, используя этот метод в настоящее время

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

Я пытался манипулировать $zipPackage.Items() объект, но получаю ошибки о файле не exising. Объект выглядит в отладчике:

>>> $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 

Просто ни о чем я привести Cannot find path 'D:\release\1.2.3.4\System.__ComObject' because it does not exist.

Мне не нужно будет извлекать файл в какое-то временное место, просто чтобы спуститься на один шаг, но я не понимаю, как это сделать?

ответ

0

Рассматривали ли вы использование ZIP-библиотеки, такой как DotNetZip для этой задачи?

http://dotnetzip.codeplex.com/

+0

Я в конечном итоге просто призывающий 7zip - оказывается, что эффективность экстракции была бездонной (несколько kB/sec), используя метод, который я попытался сделать выше. – carlpett

2

Если вы знаете имя родительской папки в файл почтового индекса, вы можете дать оболочки COM-объект, что имя вместо этого. Так что в вашем случае, что-то вроде:

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

Теперь, когда вы звоните $ zipRoot.Items() вы можете получить отдельные подкаталоги этого корня. Вы можете полуавтомат это поколение корневого тракта с помощью Objectto запроса родительского почтового индекса для имени корня внутри архива:

$shellApplication = new-object -com shell.application 
$zipPackage = $shellApplication.NameSpace($zipfilename) 
$zipRoot = $shellApplication.NameSpace(($zipPackage.Items() | select -ExpandProperty Path) 
Смежные вопросы