Извлеките файлы 7z, защищенные паролем, с помощью Powershell

Я пытаюсь извлечь кучу файлов 7z.

Мне удалось получить эти два набора сценариев Powershell из других сообщений Stackoverflow, но ни один из них, похоже, не работает.

$7ZipPath = '"C:\Program Files\7-Zip\7z.exe"'
$zipFile = '"F:\NHSFTP\WH_20240803_1.7z"'
$zipFilePassword = "xYxYxYx"
$command = "& $7ZipPath e -oe:\ -y -tzip -p$zipFilePassword $zipFile"
iex $command


$7ZipPath = '"C:\Program Files\7-Zip\7z.exe"'
$zipFile = '"F:\NHSFTP\WH_20240803_1.7z"'
$zipFilePassword = "xYxYxYx"
$command = "& $7ZipPath e -oW:\ADMINISTRATION -y -tzip -p$zipFilePassword $zipFile"
iex $command

Что мне не хватает?

Я также пытаюсь открыть несколько файлов 7z, а не один.

Я выражаю что-то подобное?

$zipFile = '"F:\NHSFTP\*.7z"'

Обновлять

Это то, что мне нужно запустить (обновленный скрипт)?

$7ZipPath = 'C:\Program Files\7-Zip\7z.exe'
$zipFile = 'F:\NHSFTP\WH_20240803_1.7z'
$zipFilePassword = 'xYxYxYx'
& $7ZipPath e -oe:\ -y -tzip -p$zipFilePassword $zipFile

Зачем нужен Invoke-Expression? Просто поставьте & $7ZipPath e -oe:\ -y -tzip -p$zipFilePassword $zipFile на отдельной строке. Кроме того, не указывайте ничего, что у вас есть в переменных, PS позаботится об этом. Т.е. $7ZipPath = 'C:\Program Files\7-Zip\7z.exe'. Никаких двойных кавычек.

n0rd 08.08.2024 01:36

Кроме того, пожалуйста, сосредоточьтесь на одной проблеме, которая у вас возникла.

n0rd 08.08.2024 01:39

@n0rd Спасибо за ваш отзыв. Я обновил пост с вашим предложением. Можете ли вы просмотреть обновленный сценарий и сообщить мне, если что-то не так?

Java 08.08.2024 01:54

Вы можете использовать такой инструмент, как Process Monitor, чтобы узнать фактические параметры, используемые для инициализации внешнего процесса, и это может показать вам, что может быть не так. Кроме того, современные ИИ очень хорошо пишут такие скрипты и умеют правильно указывать пути к файлам в кавычки, чтобы вы могли запутаться.

Lex Li 08.08.2024 01:55

7z в наши дни многопоточный, и это круто

js2010 08.08.2024 15:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь нет смысла использовать Invoke-Expression, я предлагаю создать функцию, которую вы сможете легко использовать позже. Также 7zip способен определять алгоритм сжатия, поэтому вы можете просто удалить -tzip в качестве аргумента.

function Expand-7zip {
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(
        'PSAvoidUsingPlainTextForPassword', '')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [Alias('FullName')]
        [string] $Path,

        [Parameter()]
        [string] $OutputPath,

        [Parameter()]
        [string] $Password
    )

    process {
        $params = @(
            'e'
            if ($OutputPath) {
                '-o' + $PSCmdlet.GetUnresolvedProviderPathFromPSPath($OutputPath)
            }
            '-y'
            if ($Password) {
                '-p' + $Password
            }
            $PSCmdlet.GetUnresolvedProviderPathFromPSPath($Path)
        )

        & 'C:\Program Files\7-Zip\7z.exe' @params
    }
}

Затем вы можете использовать его следующим образом:

Expand-7zip F:\NHSFTP\WH_20240803_1.7z -OutputPath E:\ -Password xYxYxYx

А для извлечения нескольких файлов вы можете передать вывод Get-ChildItem в эту функцию (учитывая, что в этом примере все файлы имеют один и тот же пароль):

Get-ChildItem F:\NHSFTP\ -Filter *.7z | Expand-7zip -Password xxxxx

Я подозреваю, что это сломается, если пароль содержит символ, который (неправильно) интерпретируется парсером.

Bill_Stewart 09.08.2024 23:18

@Bill_Stewart, можешь ли ты придумать что-нибудь, что могло бы вызвать это?

Santiago Squarzon 09.08.2024 23:26

Другие вопросы по теме