Пакетный экстракт нескольких проходов защищен .7z - PullRequest
0 голосов
/ 20 февраля 2020

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

. :

EncryptedFile1_02192020.7z

EncryptedFile1_password.txt

EncryptedFile2_02192020.7z

EncryptedFile2_password.txt

только если сценарий работает ниже находятся 1 .7z и 1 .txt файл в папке.

$pass = get-content *.txt
7z.exe x *.7z -p"$pass" -o*

Проблема: я не знаю, как использовать комбинацию операторов foreach и -Like для пакетного извлечения нескольких зашифрованных файлов в рабочем каталоге. Заранее благодарим за помощь.

1 Ответ

0 голосов
/ 20 февраля 2020

Вот один из методов. Он собирает файлы внутри корневой папки, группирует их по первой части имени файла перед подчеркиванием _ и находит внутри этих групп файлы, заканчивающиеся на .txt и .7z.
Если у нас есть оба, пароль читается из текстового файла и файл 7z извлекается.

Get-ChildItem -Path 'TheFolderWhereTheFilesAre' -File | 
    Group-Object @{Expression = {($_.Name -split '_')[0]}} |
    Where-Object { $_.Count -gt 1 } | 
    ForEach-Object {
        $pwFile = $_.Group | Where-Object { $_.Extension -eq '.txt' }
        $7zFile = $_.Group | Where-Object { $_.Extension -eq '.7z' }
        if (($pwFile) -and ($7zFile)) {
            Write-Host "Extracting file '$($7zFile.FullName)'"
            # the single quotes are needed when the password contains spaces or special characters
            $pass = "'{0}'" -f (Get-Content -Path $pwFile.FullName -Raw)
            7z.exe x $($7zFile.FullName) -p"$pass" -o* 
    }
}

Примечание. Если все файлы начинаются с EncryptedFile_, вы можете добавить -Filter 'EncryptedFile_*.*' в командлет Get-ChildItem ускорить процесс

...