Powershell распаковать одну конкретную папку в файл с динамическим именем - PullRequest
0 голосов
/ 07 октября 2019

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

Единственная проблема, которую я имею, заключается в том, что имя архива меняется месяц за месяцем, поэтому я хотел использовать подстановочный знак. После того, как подстановочный знак указан (* в $zipfile), скрипт не работает для меня.

Буду благодарен за любые предложения.

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null

$zipfile = 'C:\ALL\Debtor*.zip'
$folder  = 'tmp\st\sd'
$dst     = 'C:\ALL\ZipOutput'

[IO.Compression.ZipFile]::OpenRead($zipfile).Entries | ? {
  $_.FullName -like "$($folder -replace '\\','/')/*.*"
} | % {
 $file   = Join-Path $dst $_.FullName
 $parent = Split-Path -Parent $file
 if (-not (Test-Path -LiteralPath $parent)) {
  New-Item -Path $parent -Type Directory | Out-Null
}
[IO.Compression.ZipFileExtensions]::ExtractToFile($_, $file, $true)

1 Ответ

1 голос
/ 07 октября 2019

Попробуйте это для размера. Просто используйте Get-ChildItem, чтобы найти zip-файл в вашем каталоге ALL.

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null

    $zipfile = Get-ChildItem -Path C:\ALL\ -Filter *.zip | Where-Object {$_.Name -like "Debtor*"} | Select-Object -ExpandProperty FullName
    $folder  = 'tmp\st\sd\'
    $dst     = 'C:\ALL\ZipOutput'

    [IO.Compression.ZipFile]::OpenRead($zipfile).Entries | Where-Object {
        $_.FullName -like "$($folder -replace '\\','/')/*.*"
    } | ForEach-Object {
        $file   = Join-Path $dst $_.FullName
        $parent = Split-Path -Parent $file

        if(-not (Test-Path -LiteralPath $parent)) {
            New-Item -Path $parent -Type Directory | Out-Null
        }
        [IO.Compression.ZipFileExtensions]::ExtractToFile($_, $file, $true)
    }

Я также предполагаю, что имя архива изменяется, но нет нескольких архивов с таким именем. Если есть, вам нужно будет обернуть все в Foreach($zip in $zipfile){ ... }

...