Распакуйте архивный zip-файл в папку с тем же именем, что и архивный zip-файл - PullRequest
0 голосов
/ 30 марта 2020

Я могу успешно разархивировать заархивированный файл, используя скрипт Powershell, следующим образом:

$filePath = "s:\Download Data Feed\"
$zip = Get-ChildItem -Recurse -Path $filePath | Where-Object { $_.Extension -eq ".zip" } 

foreach ($file in $zip) { 
Expand-7Zip -ArchiveFileName $file -Password "Password" -TargetPath $filePath
}

Read-Host -Prompt "Press Enter to exit"

Файл zip - это csv-файлы. Но я хотел бы распаковать csv-файл в папку с тем же именем, что и сам zip-файл (так же, как когда вы щелкаете правой кнопкой мыши по zip-файлу, вы можете выбрать его для извлечения как самого файла, так и в папку того же самого файла). имя в виде почтового файла). Я пытался посмотреть на переключатели для команды Expand-7Zip, но не могу их найти.

Спасибо

1 Ответ

0 голосов
/ 30 марта 2020

Вы можете сделать что-то вроде следующего (я не могу проверить с помощью Expand-7Zip):

$filePath = "s:\Download Data Feed\"
$zip = Get-ChildItem -File -Recurse -Path $filePath | Where-Object { $_.Extension -eq ".zip" }

foreach ($file in $zip) { 
    $target = Join-Path $filePath $file.BaseName
    if (!(Test-Path $target -PathType Container)) {
        $null = New-Item -ItemType Directory -Path $target
    }
    Expand-7Zip -ArchiveFileName $file -Password "Password" -TargetPath $target
}

Объяснение:

Каждый FileInfo объект, содержащийся в коллекция $zip имеет свойство BaseName, которое является именем файла без расширения.

Join-Path используется для соединения пути с дочерним путем. Дочерний путь здесь будет равен BaseName $file во время каждой итерации.

Test-Path используется для проверки, если путь уже существует. Если путь $target не существует, он будет создан из-за команды New-Item .


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

$target = $file.FullName -replace '\.zip$'
...