Извлеките определенные файлы из ZIP-файла с помощью сценария PowerShell.

В настоящее время у меня есть сценарий, который я использую для извлечения определенных файлов .xml из некоторых папок. Однако мне нужно сделать то же самое с zip-файлами в этих же папках, а командлет Expand-Archive не может сделать именно то, что мне нужно. Может ли кто-нибудь предложить какую-либо помощь? Вот мой оригинальный скрипт:

param (
    [string]$loannumber,
    [string]$mids
)

$ErrorActionPreference = "Continue"

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
$config = [xml][IO.File]::ReadAllText("$MyDir\MessageGatherConfig.xml")

#$loannumber = '1479156692'
#$mids = 'M1,M2,DUREQ'

$selectedmids = $mids.Split(",")

foreach ($mid in $selectedmids) {
    $filestocopy = @()
    Write-Host "Checking for $mid messages..."

    $midfile = ($config.MessageGatherConfig.MessageFilePatterns.FilePattern | Where-Object {$_.messageid -eq $mid})
    $pattern = $midfile.pattern

    $copyfiles = $false

    foreach ($path in $midfile.Path) {

        $searchval = $pattern.Replace("LOANNUMBER", $loannumber)

        Write-Host "Searching $path for $searchval"

        $dircmd = "dir /b $path\$searchval"
        $files = ""

        $files = cmd.exe /c $dircmd

        if ($files -ne $null) {
            $copyfiles = $true
            $files = $files.replace('[', '`[')
            $files = $files.replace(']', '`]')

            $files2 = $files.Split([Environment]::NewLine)

            foreach ($filename in $files2) {
                $filestocopy += "$path\$filename"
            }
        }       

    }

    if ($copyfiles) {
        Write-Host "Copying $mid files to local folder"

        if (Test-Path $MyDir\$loannumber\$mid) {
            Remove-Item $MyDir\$loannumber\$mid -Force -Recurse 
        }

        New-Item $MyDir\$loannumber\$mid -type directory
    }
}

person Seqenenre Tao II    schedule 26.09.2017    source источник
comment
Скриншоты не помогают. Вставьте пример кода, который вы используете, и расскажите, почему он не работает (сообщения об ошибках и т. д.).   -  person Bill_Stewart    schedule 26.09.2017
comment
Я только что опубликовал весь свой оригинальный сценарий. Дело не в том, что это не работает. Мне просто нужно, чтобы он работал и с zip-файлами, и я не знаю, как это сделать.   -  person Seqenenre Tao II    schedule 26.09.2017
comment
Что значит работать и с zip-файлами?   -  person Bill_Stewart    schedule 26.09.2017
comment
Мой скрипт уже работает при извлечении определенных файлов из папок. В этих же папках есть zip-файлы, из которых мне также нужно извлечь определенные файлы. Я ищу помощь в редактировании моего сценария, чтобы выполнить это.   -  person Seqenenre Tao II    schedule 26.09.2017
comment
Почему Expand-Archive у вас не работает?   -  person Bill_Stewart    schedule 26.09.2017
comment
У меня есть большое количество zip-файлов, каждый из которых содержит более 200 xml-файлов, мне нужно только несколько из каждого zip-файла. Expand-Archive извлекает каждый отдельный файл, и я не нашел способа заставить командлет применяться к определенным файлам. мне не нужно извлекать каждый файл.   -  person Seqenenre Tao II    schedule 26.09.2017
comment
Я бы порекомендовал zip-инструмент, который позволяет извлекать только определенные файлы.   -  person Bill_Stewart    schedule 27.09.2017


Ответы (1)


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

function extractZipToTemp () {
    Param (
        $ZipFilePath
    )

    # Generate the path to extract the ZIP file content to.
    $extractedContentPath = "$([System.IO.Path]::GetTempPath())$(([guid]::NewGuid()).tostring())"
    # Extract the ZIP file content.
    Expand-Archive -Path $ZipFilePath -DestinationPath $extractedContentPath -Force
    # Return the path to the extracted content.
    return $extractedContentPath
}

Если вы хотите, чтобы содержимое оставалось локальным для каталога, из которого вы выполняете скрипт, просто настройте вышеуказанную функцию следующим образом.

function extractZipToTemp () {
    Param (
        [Parameter(Mandatory = $true, Position = 0)]
        [String]$ZipFilePath,

        [Parameter(Mandatory = $true, Position = 1)]
        [String]$ExtractPath
    )

    # Generate the path to extract the ZIP file content to.
    $extractedContentPath = "$extractPath\$($ZipFilePath | Split-Path -Leaf)"
    # Extract the ZIP file content.
    Expand-Archive -Path $ZipFilePath -DestinationPath $extractedContentPath -Force
    # Return the path to the extracted content.
    return $extractedContentPath
}

При использовании любого из вышеупомянутых методов не забудьте выполнить очистку после копирования нужных файлов.

person ekeeling    schedule 26.09.2017
comment
Я попробую. Спасибо, сэр. - person Seqenenre Tao II; 26.09.2017
comment
Без проблем. Просто дайте мне знать, если вам нужна дополнительная помощь. - person ekeeling; 27.09.2017