7-zip命令行

11

我正在创建一个备份工具,用于压缩在文本文件中列出的所有文件。我使用MS ACCESS作为我的前端,使用7-Zip进行压缩。这些是我正在使用的命令:

7zG.exe a c:\Backup\backup.zip
@c:\temp\tmpFileList.txt

所有的文件都被压缩而没有路径。有没有一种方法可以在zip文件中包含每个文件的路径?然后当 backup.zip 被提取时,文件将被还原到它们原来的文件夹结构。

谢谢


如果您成功将路径合并到zip文件中,请使用相对路径,否则您将无法在原始位置以外的任何地方还原它们。 - pavium
我们如何使我们的工具在命令行中使用起来尽可能难以理解呢...?嗯...哦,我知道了!就像这样! - Andrew
8个回答

6
这个7-zip论坛帖子中,许多人都表达了对此功能的渴望,7-zip的开发者Igor指向了FAQ问题标题为“如何在存档中存储文件的完整路径?”以实现类似的功能。
简而言之:
  • 按卷分离文件(一个列表用于C:\上的文件,一个用于D:\等)
  • 然后针对每个卷的文件列表,
    1. chdir到适当卷的根目录(例如,cd /d C:\
    2. 使用相对于卷根目录的路径(例如,C:\Foo\Bar变成了Foo\Bar)创建文件列表
    3. 像以前一样执行7z a archive.7z @filelist与这个新的文件列表
    4. 在提取全路径时,请确保首先chdir到适当卷的根目录

4

7-Zip的命令行程序是7z或7za。这里有一篇有用的文章介绍了可用选项。-r(递归)选项存储路径。


感谢Vinay的回复..但我在我的7-zip目录中找不到7za.exe,而且7z.exe为0字节。我使用了7zG.exe,因为它显示GUI进度条而不是DOS屏幕。唯一的问题是它不包括文件所在的路径。 - Arnold

1
我没有深入研究,但凭直觉,他们在便携版中放弃了命令行支持。 便携应用程序中人们不太使用命令行工具的原因是操作系统(在您的情况下为Windows)要求将可执行文件添加到%path%包含列表中。如果不满足此要求,则使用命令行工具相当麻烦。7z-a 将变成d:\portable\z7\z7-a c:\to\archive\folder*.*。对于每个操作都要打字,这就是为什么GUI适用于诸如便携应用程序之类的东西,它(应用程序)可以记住自己的位置并为您处理这些内容,如果无法运行,则知道它未连接。但是,如果您真的希望便携应用程序包含该内容,则始终可以安装完整版本,并将所需的7z.exe取出并放入便携式文件夹中,确保它与所需的dll一起。在确保附加后,您必须在进入shell时设置路径。

http://www.redfernplace.com/software-projects/patheditor/ -- 一个好的路径编辑器(down),如果你有很多路径信息(20+), 阅读起来会变得困难。

http://www.softpedia.com/get/System/System-Miscellaneous/Path-Editor.shtml -- 路径编辑器的替代来源。

不建议为临时“便携式”驱动器修改系统路径,但可以手动执行以下操作:

set path=%path%;"d:\portable\z7\";

当你运行dos cmd.exe或http://sourceforge.net/p/conemu/home/Home/时。

其他答案更好地解决了其他问题,我不打算尝试。

http://www.codejacked.com/zip-up-files-from-the-command-line/ --关于使用z7和z7a的命令行用法的良好参考。

PS:抱歉打扰了,但我认为需要一个更直接的答案来解释为什么(即使只是推测性的)。


1

尝试这个方法,对我有效。 7z.exe a d:\newFileName.7z "d:\ExistingFile.txt"

打开命令提示符,如果您已经安装了7zip应用程序,请尝试以下步骤。在命令提示符中,它会像这样:c:\programs and files\7zip\7z.exe a d:\newFileName.7z "d:\ExistingFile.txt"


0

自从7-zip版本9.25 alpha以来,有一个新的-spf开关可用于将包括驱动器号在内的完整文件路径存储到归档文件中。

7zG.exe a -spf c:\BAckup\backup.zip @c:\temp\tmpFileList.txt

现在应该可以正常工作了。


0
我创建了以下批处理文件,使用7-Zip将每个子文件夹压缩到自己的zip文件中,并保留文件结构。由于这有效地演示了命令行,我认为将其发布在这里可能会帮助其他人。
@ECHO OFF
REM Cycle Through all of the directories in the current folder
for /D %%d in (*) do (
    REM Change to the directory
    pushd %%d
    REM Make the destination directory.
    mkdir "Z:\%%d"

    REM Cycle Through all Subdirectories
    for /D %%b in (*) do (
        REM Zip up all subdirectores, and put it in the destination.
        7z -r a "Z:\%%d\%%b.zip" %%b
    )
    popd
)

0

7-Zip希望在列表文件中使用相对路径,否则它将仅存储文件名,导致重复文件名错误。

假设您的列表包含完整路径名:

  • 编辑列表文件以删除驱动器前缀,C:\
  • 确保在运行7Z时位于驱动器的根目录中,以使用上述列表文件。
  • 然后它将存储路径并且不会抱怨重复名称。它希望在列表文件中使用相对路径。

如果您的列表文件具有相对于另一个文件夹的路径,则应从该文件夹运行7Z。

更新:我注意到从上面的另一篇文章中,新的7-Zip具有不需要上述步骤的-spf选项。尚未测试,但我的步骤适用于没有此选项的早期版本。


-1

不要使用选项a,而是使用选项x,这将创建目录,但仅用于提取,而不是压缩。


2
不相关;OP询问的是在压缩时存储文件路径,而不是在解压缩时。 - Fred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接