我想从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 );