Я пытаюсь извлечь кучу файлов 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
Кроме того, пожалуйста, сосредоточьтесь на одной проблеме, которая у вас возникла.
@n0rd Спасибо за ваш отзыв. Я обновил пост с вашим предложением. Можете ли вы просмотреть обновленный сценарий и сообщить мне, если что-то не так?
Вы можете использовать такой инструмент, как Process Monitor, чтобы узнать фактические параметры, используемые для инициализации внешнего процесса, и это может показать вам, что может быть не так. Кроме того, современные ИИ очень хорошо пишут такие скрипты и умеют правильно указывать пути к файлам в кавычки, чтобы вы могли запутаться.
7z в наши дни многопоточный, и это круто
Здесь нет смысла использовать 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, можешь ли ты придумать что-нибудь, что могло бы вызвать это?
Зачем нужен
Invoke-Expression
? Просто поставьте& $7ZipPath e -oe:\ -y -tzip -p$zipFilePassword $zipFile
на отдельной строке. Кроме того, не указывайте ничего, что у вас есть в переменных, PS позаботится об этом. Т.е.$7ZipPath = 'C:\Program Files\7-Zip\7z.exe'
. Никаких двойных кавычек.