返回列表 发帖

[问题求助] PowerShell怎样用7z命令解压带密码的压缩包?

我的电脑桌面上有个带密码的压缩包, 我想使用下面的代码解压出里面的文件,
有个问题就是, 如果判断压缩包带不带密码?
如果带密码: 则弹出输入框输入密码, 直到输入正确的密码再解压, 或者不想解压了,点取消按钮取消操作,
如果不带密码: 直接解压
下面的代码, 输入两次密码后解压出了文件, 但文件都是0k的大小, 求路过大佬指导
cls
Add-Type -AssemblyName Microsoft.VisualBasic
function Unzip-File {
    param(
        [string]$ZipFile,
        [string]$ExtractFolder
    )
    [string]$PathTo7Zip = "C:\Program Files\7-Zip\7z.exe"
   
    # 如果文件存在并且不是一个目录,则执行以下操作
    if (Test-Path -Path $ZipFile -PathType Leaf) {
        # 如果文件有密码,则要求用户输入密码,直到密码正确为止
        do {
            $Password = [Microsoft.VisualBasic.Interaction]::InputBox("请输入密码", "解压缩文件", "", 0, 0)
            if ([string]::IsNullOrEmpty($Password)) {
                # 如果用户取消了输入,则退出循环
                exit
            }
            $ErrorActionPreference = 'SilentlyContinue'
            & $PathTo7Zip x $ZipFile "-o$ExtractFolder" "-p$($Password | ConvertTo-SecureString -AsPlainText -Force)"
            $IsCorrect = $?  # 检查是否出现错误
            $ErrorActionPreference = 'Continue'
        } while (!$IsCorrect)
    } else {
        Write-Host "找不到指定的文件。"
    }
}
# 调用函数来解压缩文件
$ZipFile = "$env:USERPROFILE\Desktop\test.zip"   # 压缩包路径
$ExtractFolder = "$env:USERPROFILE\Desktop\test"  # 解压缩路径
Unzip-File -ZipFile $ZipFile -ExtractFolder $ExtractFolderCOPY

下面的代码是批处理的, 如果输入错误的密码, 窗口直接就关了, 求大佬提导
@echo off
setlocal EnableDelayedExpansion
set "filename=test.7z"
set "password="
set "path=%path%;C:\Program Files\7-Zip"
for /f "tokens=2 delims=: " %%a in ('7z l -slt "%filename%" ^| findstr /c:"Encrypted = +"') do (
  set "encrypted=%%a"
)
if "%encrypted%"=="+" (
  echo The archive is encrypted.
  for /l %%i in (1, 1, 3) do (
    set /p password=Please enter the password:
    7z t "%filename%" -p"%password%" >nul 2>&1
    if not errorlevel 1 (
      echo Correct password.
      7z x "%filename%" -p"%password%"
      goto end_script
    )
    echo Invalid password, please try again.
  )
  echo Too many attempts, exiting...
) else (
  echo The archive is not encrypted.
  7z x "%filename%"
)
:end_script
endlocalCOPY

TOP

回复 2# 小白龙


   经过测试,第一次产生输密码操作在第9行,第二次在第28行。判断压缩包是否加密的命令不对,所以encrypted 的值也不对,就不会有if "%encrypted%"=="+"判断成功后的操作。即使判断成功,第17行 也有问题,set /p赋值password后,应该用!password!表示。
直接解压就好了,有密码会提示的。先判断有无密码,再解压,有点多此一举。不知道楼主是什么目的?
bat小白,请多指教!谢谢!

TOP

回复 3# 77七


    直接用命令行解压时, 只能解压出一个空文件夹, 没有出现输入密码的窗口

TOP

回复 4# 小白龙


   到官网下载最新版7z
@echo off
set "path=%path%;C:\Program Files\7-Zip"
for /f "delims=" %%i in ('dir /b /s /a-d *.7z *.rar *.zip') do (
for /l %%l in (1,1,3) do (
if not defined #"%%i" (
7z x -y -o"%%~dpi" "%%i" && set #"%%i"=1
)
)
)
pauseCOPY
bat小白,请多指教!谢谢!

TOP

回复 5# 77七


    执行后CMD窗口过一会儿就崩溃了

TOP

回复 6# 小白龙


   不知道你说的奔溃是什么意思,我这边测试解压有、无密码的7z压缩包均正常。
bat小白,请多指教!谢谢!

TOP

返回列表