我想从PHP中提取存档文件(zip,rar,z7,gz等)。因为密码可以包含特殊字符,例如,并且PHP exec不支持unicode字符(由于某种原因)。我按照php exec() in unicode mode?中所解释的那样使用批处理文件加入了。
但是,像Windows 10一样可爱,我似乎无法弄清楚如何提取一个双引号作为密码的档案...
"C:\Program Files\7-Zip\7z.exe" x "C:\Users\me\Desktop\25mb.rar" -o"C:\Users\me\Desktop\" -p"password here" -y
这是使用7zip提取的默认行。 (请注意下方) 我的文件 25mb.bin 存储在 test.rar 中,存储在 25mb.rar ,密码为“(单双引号)。
错误是:
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
Scanning the drive for archives:
1 file, 13312 bytes (13 KiB)
Extracting archive: C:\Users\me\Desktop\25mb.rar
--
Path = C:\Users\me\Desktop\25mb.rar
Type = Rar
Physical Size = 13312
Solid = -
Blocks = 1
Multivolume = -
Volumes = 1
ERROR: Data Error in encrypted file. Wrong password? : test.rar
Sub items Errors: 1
Archives with Errors: 1
Sub items Errors: 1
我试过了:
-p" *
-p"" **
-p""" *
-p"""" **
-p"^"" * (default escape for CMD)
-p"\"" *
*:该行询问我是否要覆盖,这意味着-y未执行但被视为密码的一部分。
**:执行,但有错误。提取的文件test.rar无法打开(已损坏)
注意:这个方法没有问题〜!@ @ $%^& ()_ + - = {} [] |:;'<>?,。 /€¡¿*
注意:winRAR有一个简洁的功能,您可以在其中提供一个密码文件,用于提取,而不是提供字符串。但这仅适用于RAR文件(!),因此在我的情况下无用。
rar示例:
file_put_contents( 'C:\Users\bunny\Desktop\pass.txt', $password );
exec( '"C:\\Program Files\\WinRAR\\winrar" e -ad -p "C:\\Users\\me\\Desktop\\25mb.rar" *.* "C:\\Users\\me\\Desktop\" < "C:\\Usersme\\Desktop\\pass.txt"', $extractStatus );
答案 0 :(得分:1)
是的,这个答案对我很有帮助。我在Win10笔记本的Powershell脚本中使用了此代码:
(首先,用户将密码输入$ input_txt)
$input_txt | Out-File ".\pw.txt" -Encoding default
cmd /c ".\7za.exe" e ".\myfile.zip" -o".\" -sccWIN -y `< ".\pw.txt"
并转义“ <”,因为Powershell可以使用反引号来理解这一点。