Board logo

标题: [文本处理] [已解决] 用7z解密压缩文件,密码有特殊字符”,无法解密码。 [打印本页]

作者: fzp070    时间: 2022-8-10 01:49     标题: [已解决] 用7z解密压缩文件,密码有特殊字符”,无法解密码。

本帖最后由 fzp070 于 2022-8-14 12:22 编辑

问题描述:
1、最近做了个右键调用7z命令行程序,读取密码文档,对压缩程序解密的批处理程序。
2、经过测试,大部分密码都能正常解密,包括带(^&%等特殊字符的密码,都没问题,但唯独密码中有"这个就不行了

比如密码是2234^可以, 2234”就不行,试了加双引号包起来也不行。不过 2234”这种密码的压缩包可以用7Z界面程序解压缩。
7z.exe x C:\1\A4.7z -p2234" -oC:\1\ -aoa -bse0 -bsp2>out.txt
7z.exe x C:\1\A4.7z -p"2234"" -oC:\1\ -aoa -bse0 -bsp2>out.txt

在论坛搜了下,发现有两个帖子也遇到同样问题,见下
http://www.bathome.net/viewthread.php?tid=57539&highlight=7z
http://www.bathome.net/viewthread.php?tid=56425&highlight=7z

如下链接4楼,据管理员 Batcher 说是7z的命令行模式不支持双引号"作为密码的一部分
http://bbs.bathome.net/redirect. ... 1349&ptid=56425

因为以上两个帖子是2020年8月、2021年1月的,距现在1年半了, 想问问是不是有方法可以解决此问题了?
另外如果还是无法解决,那有没有可以替代的,因为我只用7z,其它压缩软件不太了解,Winrar、Bandizip、NanaZip等等有命令行工具吗?能命令行解任意字符密码吗?感谢!
作者: xczxczxcz    时间: 2022-8-10 09:55

看看偶用的7Z是不是假的
建立文档:
  1. S>7z a xx.7z a.txt -p"aaa"bbb"ccc
  2. 7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03
  3. Scanning
  4. Updating archive xx.7z
  5. Compressing  a.txt
  6. Everything is Ok
复制代码
解压文档
  1. b>7z e xx.7z -p"aaa"bbb"ccc
  2. 7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03
  3. Processing archive: xx.7z
  4. Extracting  a.txt
  5. Everything is Ok
  6. Size:       98
  7. Compressed: 221
复制代码

作者: fzp070    时间: 2022-8-10 13:15

呃,我这不行啊,我的7z版本是22.01,难道要4.65版本的?我去找找看能不能下载到
  1. C:\1>7z e xx.7z -p"aaa"bbb"ccc
  2. 7-Zip 22.01 (x64) : Copyright (c) 1999-2022 Igor Pavlov : 2022-07-15
  3. Scanning the drive for archives:
  4. 1 file, 237 bytes (1 KiB)
  5. Extracting archive: xx.7z
  6. ERROR: xx.7z
  7. Cannot open encrypted archive. Wrong password?
  8. Can't open as archive: 1
  9. Files: 0
  10. Size:       0
  11. Compressed: 0
  12. C:\1>
复制代码

作者: fzp070    时间: 2022-8-10 13:22

说一下新的尝试:
1、今天已经试过Winrar的命令行了,好像只支持rar格式,这肯定不行,需要解压各种类型,所以排除了。

2、然后试了Bandizip,这个的命令行,与7z很相似,而且一样存在 英标双引号 无法解压缩的问题。

3、另外还发现了一个新问题,无论7z还是Bandizip,遇到压缩包名称含有^时,要么解压不了,要么提示找不到压缩包。不过这点没关系,我可以提前改名,主要是密码我无法控制,有些密码就是有双引号",所以还是想看有什么方法解决。

上面2楼的方法在我这不行,可能是7z版本的差异吧,我等下去下载一个试试,感谢2楼(@xczxczxcz)!
作者: fzp070    时间: 2022-8-10 13:39

回复 2# xczxczxcz


    2楼方法已试,7z 4.65也已找了,实际是不行的。
必须是用这个加密的,才能解密,本质上用这个加密时,双引号是丢失了的,密码直接变成了aaabbbccc,所以不行啊

作者: xczxczxcz    时间: 2022-8-10 19:08

回复 5# fzp070

刚才那方法确实把双引号吃了, 掉到7Z的坑里了, 不过不要紧偶等用另一种转义方法,本来不想再写BAT的,今天?
先用 ^转义"号,再用 \(/)转义即可,  即:/^"(或\^",这是转义了一个双引号,不会被吃掉);  /^""/^"=";用一对双引号来包裹一个双引号。

====另少看 CSDN 上的文章。能不看则不看。纯属垃圾。
  1. mkdir b
  2. 7z a x.7z a.txt -paa/^""/^"dd
  3. copy /y x.7z b\
  4. cd b
  5. echo 解压文件
  6. 7z e x.7z -paa/^""/^"dd
  7. pause
复制代码
:: 你再试试, 偶测了下,木有问题。

.
作者: xczxczxcz    时间: 2022-8-10 19:20

这么多年了,总共加起来用7Z的时间不足半小时,就加了一个7z.exe的环境变量,一直在那睡觉。一般用RAR打开文件看下,更多的是用ZIP,直接用POWERSHELL操作,另外设密码感觉就是为难自己。用一张大硬盘把有用的资料备份后不连机。电脑及文件不设任何密码。一些小的或临时的文件写个FTP上传路由器临时保存。
作者: fzp070    时间: 2022-8-10 20:29

回复 6# xczxczxcz

感谢解答!
不是我想设密码,是网上下载内容经常有密码,而解压要输密码麻烦,所以想右键直接调取本地文件里的密码,直接给解压了。

网上下载的文件压缩格式很多样,7z、zip、rar等都有,winrar命令行工具 只支持他自家的rar格式,zip应该不支持rar、7z等解压吧。

通过斜杠、^、双重双引号转义来确保 双引号”字符的不被吃,这个方法可能就只适于单一明确密码了。

通过变量读取文本内的N多个密码,是没法这样精准添加转义了。除非手动提前一个改好。

哎,看来不好弄,我又试了下NanaZip,发现他的命令行 操作与7z非常类似,不过也遇到这个问题,不过他参数好像多些,再继续研究下

感谢的@xczxczxcz 耐心解答,谢谢!
作者: holley    时间: 2022-8-11 08:45

回复 8# fzp070
先读取密码文件将带"的密码文本转义一遍,再调用可行?
作者: fzp070    时间: 2022-8-11 10:31

回复 9# holley

感谢解答!
1、先读取密码文件将带"的密码文本转义一遍,再调用可行?---应该可行的,我再研究下

2、目前我就是在调用解密过程中,加了个识别密码字符串中是否带双引号",如果有”就转为密码手动输入模式,如果没有双引号就命令自动输入,现在双引号的密码还不太多,所以勉强也行。但还是做不到无人值守、程序自动运行完全程。

3、如果能边解密、边识别双引号的密码字符串、并自动转义,这个方法应该很不错,待我研究下。感谢9楼@holley 提供思路。

其实要是压缩工具,原生支持"双引号",就更好了,我都研究了好几种压缩软件,全部都有这类问题。Winrar的命令行工具 还只支持rar一种格式。无语!
作者: idwma    时间: 2022-8-11 13:42

  1. echo  2234"|7z.exe x C:\1\A4.7z -oC:\1\ -aoa -bse0 -bsp2>out.txt
复制代码

作者: Batcher    时间: 2022-8-11 14:47

回复 4# fzp070


WinRAR有两个命令行工具:rar.exe和winrar.exe
前者不支持zip文件,后者支持zip文件。
作者: fzp070    时间: 2022-8-11 22:29

回复 11# idwma


    感谢解答,等下我试试先!
作者: fzp070    时间: 2022-8-11 22:31

回复 12# Batcher


    感谢解答!
之前用的Rar.exe,等下我再试试winrar.exe。
非常感谢大家的帮助!
作者: fzp070    时间: 2022-8-12 00:31

回复 11# idwma


此方法已试,对”双引号"确实可以!

很奇特,7z都没有 -p参数,此时会弹出输入密码状态,此方法将echo 内容通过|直接转给7z,7z刚好在密码输入界面,就自动接收echo输出内容,并下一步,从而实现了密码输入并解压。没想到这么用,论坛能人多,感谢!

不过也有新问题了,具体是我在尝试各种特殊字符密码验证的时候,目前发现含^的密码会出错,原因是echo 内容如果有^会直接消失。不清楚还有没有其它字符会消失。
具体验证一个密码20'`."“48"^"2"^",通过观察发现直接echo会将两个^丢失,应该是这导致解压不成功。两加双引号可以不丢^但echo也会多输出两个"给7z
  1. @echo off
  2. FOR /F "delims=" %%i in ('echo 20'`."“48"^"2"^"') do (
  3.     echo %%i
  4. )
  5. echo 20'`."“48"^"2"^"
  6. echo "20'`."“48"^"2"^""
  7. echo 隔1
  8. set "a=20'`."“48"^"2"^""
  9. echo %a%
  10. echo "%a%"
  11. echo 隔2
  12. echo %a%%
  13. echo ^%a%
  14. echo 隔3
  15. echo %%a%%^
  16. echo 隔4
  17. echo 隔5
  18. echo 隔6^
  19. echo end
  20. echo %a% |7z.exe x raddr.7z -oC:\1\ -aoa -bse0 -bsp2
复制代码
  1. 20'`."“48""2""
  2. 20'`."“48""2"^"
  3. "20'`."“48"^"2"^""
  4. 隔1
  5. 20'`."“48""2"^"
  6. "20'`."“48"^"2"^""
  7. 隔2
  8. 20'`."“48""2"^"
  9. 20'`."“48""2"^"
  10. 隔3
  11. %a%echo 隔4
  12. 隔5
  13. 隔6echo end
  14. 7-Zip 22.01 (x64) : Copyright (c) 1999-2022 Igor Pavlov : 2022-07-15
  15. Scanning the drive for archives:
  16. 1 file, 237 bytes (1 KiB)
  17. Extracting archive: raddr.7z
  18. Enter password (will not be echoed):
  19. Can't open as archive: 1
  20. Files: 0
  21. Size:       0
  22. Compressed: 0
  23. 请按任意键继续. . .
复制代码

作者: idwma    时间: 2022-8-12 12:10

回复 15# fzp070

好像也可以直接用存在文件里的密码
  1. 7z.exe x raddr.7z -oC:\1\ -aoa -bse0 -bsp2 <pwd.txt
复制代码

作者: fzp070    时间: 2022-8-12 23:50

回复 16# idwma


    感谢解答!
明天有时间,实际验证下,谢谢分享帮助!
作者: fzp070    时间: 2022-8-13 23:48

本帖最后由 fzp070 于 2022-8-13 23:52 编辑

回复 16# idwma


    感谢解答,从文本接收密码的方法,已经试了,这个不行哦

顺便说下目前的进展:

1、上面说得将""双引号之类的代码转换下再作密码接收,弄了好久我没搞定,因为在遇到"|^&等各种特殊符合在一起的密码时,会出错。---目前个人能力暂无法搞定

2、我目前的方法是在密码传进7z解压前进行分类操作:
A、将无英标双引号的密码传给7z的-p密码接收参数,
  1. "%paths%\7z.exe" x %paths1% -p"!pw!" -o%paths2%\ -aoa -bse0 -bsp2>7zOut.txt&&goto pass
复制代码
B、将有双引号但无^符号的传递给echo !pw!|7z,
  1. echo !pw!|7z.exe x %paths1% -o%paths2%\ -aoa -bse0 -bsp2>%paths3%\7zOut.txt&&goto pass
复制代码
C、将既有双引号且有^号的密码,传给密码手动输入界面方案。同时在进入密码手动输入操作前,将密码传递给系统剪切板,在进入密码操作后,按Ctrl+V 或鼠标右键将密码输进去,只需按回车即可。
  1. set/p="!pw!"<nul|clip&&"%paths%\7z.exe" x %paths1% -o%paths2%\ -aoa -bse0 -bsp2>7zOut.txt&&goto pass
复制代码
新问题:
目前三种分类中,A方案、B方案,没什么问题。
但C方案中一般的密码也没问题,只是在遇到中文双引号的密码时会变成英文双引号,导致仍需要人去修正。
我试了用如下命令粘贴出来是的没有问题,但不知道咋将这个粘贴结果传给7z手动输入界面的作为密码接收?
  1. powershell -sta "add-type -as System.Windows.Forms; [windows.forms.clipboard]::GetText()"
复制代码
例如密码为:x^1@#$%&*(:&&}{|3^5"6”4-_aa

大佬们能帮忙看看吗?谢谢了
回复 12# Batcher
作者: fzp070    时间: 2022-8-14 00:53

回复 18# fzp070


    CMD窗口粘贴中文双引号 变英文双引号的问题,已经解决了,方法:

CMD窗口--标题栏 右键 属性--选项页--编辑选项--取消勾选【粘贴时筛选剪贴板内容(F)】,这样就能 原样粘贴 了。

这样的话只要粘贴结果正确,我再研究下,看能不能自动粘贴、并在粘贴后 自动回车,实现无人操作即可自动输入密码解压缩。---待明天研究,先睡觉了
作者: fzp070    时间: 2022-8-14 12:20

首先说下结论:
问题已解决。目前工具已实现任何密码均可以自动输入密码进行解压缩。

具体经过:
1、之前在尝试自动输入密码和回车的时候,发现如下三种方式输出密码到剪贴板方式,仍会存在一些问题,如下示例密码就不行,无论加双引号和不加双引号都会出错。
  1. echo !pw!|CLIP
  2. set/p="!pw!"|clip
  3. echo "!pw!" |xclip.exe" /set
复制代码
  1. [b][color=Red]示例密码:[/color][/b]1"@>::”#<$%"*%@“=?(*::"=*}{3"5*!!?%&|=6$”"4……-^_a=*a`~*()-_=+aa
复制代码
2、故又搜索找了好几种方法,包括powershell方式,最终发现 管理员老大在 Batcher 在2008年就分享一个非常好的【支持命令行调用的剪贴板工具winclip.exe】,分享地址:
http://www.bathome.net/viewthrea ... =%BC%F4%CC%F9%B0%E5

3、winclip.exe工具,好像没法直接将字符串发送到剪贴板,但可以从文本中读取后再输出到剪贴板,之后再调取剪贴板内容进行输出到7z,大概流程的代码如下
  1. ::输出当前获取的密码到1.txt文本
  2. echo !pw!>1.txt
  3. ::从1.txt文本获取并复制到剪贴板
  4. winclip.exe" -c 1.txt
  5. ::从剪贴板粘贴
  6. winclip.exe -p
  7. ::这是运用到7z密码输入的方法,这种方式会自动输密码,且会自动回车,非常棒,完美解决本贴问题。
  8. "%paths%\winclip.exe" -p|"%paths%\7z.exe” x %paths1% -o%paths2%\ -aoa -bse0 -bsp2>%paths3%\7zOut.txt&&goto pass
复制代码
最终感谢:
本次问题能最终解决,离不开本贴所有回复的大佬 给予提供解决方法和解决思路,也离不开【批处理之家】的N多优秀资源和各种问题求助解决信息,非常感谢论坛和大家的帮助!
作者: WBATW    时间: 2023-4-1 12:05

本帖最后由 WBATW 于 2023-4-1 12:14 编辑

  一条鱼,有头有尾
作者: yydy777    时间: 2023-8-2 16:04

终于找到解决办法 特来注册感谢
作者: Five66    时间: 2023-8-3 13:07

我也来说一下吧
使用echo命令过管道,"|^&之类的字符需要二次转义
以^为例,要表示^,就需要转义^,即^^,要表示^^,就需要对^^中的每一个^再次进行转义,即^^^^

假设压缩包为密码单个的^,过管道方式测试压缩包(^跟|之间不能有空格)
  1. echo ^^^^|7z t aaaaaaa.7z
复制代码
假设压缩包密码为单个的^,使用普通变量,过管道方式测试压缩包(|符号左边不能有空格)
  1. set "pw=^"
  2. echo %pw:^=^^^^%|7z t aaaaaaa.7z
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2