Копировать файлы из каталога в zip-файл - PullRequest
0 голосов
/ 05 марта 2012

В результате нашего процесса сборки получается несколько файлов .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.

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

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

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

Теперь, когда вы вызываете $ zipRoot.Items (), вы можете получить отдельные подпапки этого корня. Вы можете полуавтоматизировать создание этого корневого пути, используя родительский zip-объект для запроса имени корня в zip-файле:

$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
$zipRoot =  $shellApplication.NameSpace(($zipPackage.Items() | select -ExpandProperty Path)
0 голосов
/ 06 марта 2012

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

http://dotnetzip.codeplex.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...