PowerShell извлечь содержимое папки из zip - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть несколько папок, скажем, они Folder1, Folder2, Folder3, etc. Внутри каждой из них есть .zip файл, названный как имя папки.Так что Folder1.zip, Folder2.zip, Folder3.zip, etc. Внутри каждого почтового индекса есть path как Content/1/a/5/t/ZIPNAME/a/b/c/temp.Путь тот же, за исключением того, где ZIPNAME - это итерируемый в данный момент почтовый индекс.В папке temp есть файлы, которые мне нужно скопировать во вновь созданную папку, например имя .zip.Как я могу достичь этого?

Это то, что я получил в данный момент.Перебирая все папки, получая zip и открывая его.Как получить содержимое из zip-файла и скопировать его в новую папку?

    Set-Location -Path $(BaseDeployPath)
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    Get-ChildItem -Recurse -Directory | ForEach-Object {
          $zipPath = Get-ChildItem $_.FullName -Filter *.zip
          $zip = [System.IO.Compression.ZipFile]::OpenRead($zipPath)

          $contentPath = ???

          $zip.Entries | Get-Content $contentPath
    }

    # close ZIP file
    $zip.Dispose()
}

1 Ответ

0 голосов
/ 28 ноября 2018

Пожалуйста, ознакомьтесь с документацией.Метод OpenRead() возвращает объект ZipArchive, свойство которого Entries содержит коллекцию объектов ZipArchiveEntry.Эти объекты имеют (среди прочего) свойство FullName с относительным путем к элементу внутри архива, поэтому вы должны иметь возможность выбрать файл, который хотите обработать, следующим образом:

$temp = 'Content/1/a/5/t/ZIPNAME/a/b/c/temp/'

$zip = [IO.Compression.ZipFile]::OpenRead($zipPath)
$entries = $zip.Entries | Where-Object { $_.FullName.StartsWith($temp) -and $_.Name }

дополнительное предложение -and $_.Name исключает записи каталога (которые имеют пустое свойство Name) из результата.

В документации также указан метод ExtractToFile(), который предположительно позволяет извлекать записи в файлы.Тем не менее, этот метод не был доступен на моей тестовой коробке.Не уверен, доступен ли он просто в PowerShell или он был добавлен в более новую версию .Net framework.

Вы можете извлечь файлы старомодным способом, хотя:

$entries | ForEach-Object {
    $dstPath = Join-Path 'C:\destination\folder' $_.Name

    $src = $_.Open()
    $dst = New-Object IO.FileStream $dstPath, 'Create', 'Write', 'Read'
    $src.CopyTo($dst)
    $src.Close(); $src.Dispose()
    $dst.Close(); $dst.Dispose()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...