【问题标题】:Console command to extract only a single file from archive? (7z)控制台命令仅从存档中提取单个文件? (7z)
【发布时间】:2016-06-11 10:16:05
【问题描述】:

我有一个脚本可以将文件夹中的所有档案提取到具有档案名称的文件夹中,我想对其进行修改,以便它只会从每个档案中提取一个文件(不管是哪个文件),它会表现得好像有一个计数器会计算 1 个文件并移动到下一个存档。

例如,假设我们在文件夹中有以下文件,每个存档都包含大括号中的内容:

a.7z {folder{1.txt, 2.txt, 3.txt}}
b.7z {folder2{4.txt, 5.txt, 6.txt}}
c.7z {7.txt}

因此运行脚本将导致提取以下内容(那些是文件夹):

a{folder{1.txt}}
b{folder2{4.txt}}
c{7.txt}

这可能吗?

这是我目前拥有的脚本:

PATH %PATH%;"C:\Program Files\7-Zip";
7z x *.* -o*

【问题讨论】:

    标签: windows scripting 7zip


    【解决方案1】:

    您可以使用列出存档的文件

    7z l a.7z
    

    如果所有文件都以txt结尾,则可以使用

    7z l a.7z | find "txt"
    

    使用此答案获取第一行: Windows batch command(s) to read first line from text file

    然后使用此答案从行中获取文件名(最后一个单词)并将其保存在批处理变量中 FILE_NAMEhttps://superuser.com/questions/667494/batch-to-extract-a-word-from-a-string-inside-a-text-file

    然后使用以下命令解压文件:

    7z e -i!%FILE_NAME% a.7z -o*
    

    您可以使用此示例迭代所有 *.7z 文件 Iterate all files in a directory using a 'for' loop

    for /r %%i in (*.7z) do echo %%i
    

    所有部分放在一起:

    @echo off
    
    for  %%i in (*.7z) do call :extract_file %%i
    
    :extract_file
    "c:\Program Files\7-Zip\7z.exe" l %1 > temp.txt
    for /f "skip=15 tokens=1-10" %%a in (temp.txt) do (
      echo %%f
      "c:\Program Files\7-Zip\7z.exe" e -i!%%f %1 -o*
      goto :end
    )
    :end
    EXIT /B 0
    
    :eof
    

    【讨论】:

    • 档案的扩展名可以是任何东西,甚至zip1rar1,其中的文件也可以是任何东西,我想在每个档案中保留文件夹结构提取但仅提取一个文件而不是所有存档。
    • 我用更完整的解决方案编辑了答案。我仍然没有找到保持 7z 文件结构的方法。
    • 我认为使用“7z x”而不是“7z e”将保留目录结构。此外,您可能需要在周围加上双引号和通配符过滤器;例如"*.pdf" 而不仅仅是 *.pdf
    • 我收到了:>7z e -i!%"Target\NMD\2021-2022\Renewal.xlsm"% Target.zip -o* ; No files to process ; Everything is Ok ; Files: 0 ; Size: 0
    【解决方案2】:

    以下内容可根据需要进行。该文件是“Target.zip”。 ZIP 文件中的顶级文件夹是“Target”。所需文件“Renewal.xlsm”处于更深层次。 zip 中的目录树应为未压缩文件复制。与 Scripting.FileSystemObject (scrrun.dll)、Windows Script Host (wshom.ocx) 和 Microsoft Shell Controls (shell32.dll) 不同,此解决方案是异步运行的。

    这会将Target.zip 中的单个文件Renewal.xlsm 提取到名为Target 的文件夹中。

    unzip "Target.zip" "Target\NMD\2021-2022\Renewal.xlsm" -d "Target"
    

    https://unix.stackexchange.com/a/57522/20731

    unzip 安装在我的公司计算机上,但没有安装在我个人现成的 Windows 上。根据他们自己的报告,Unzip 存在漏洞,所以我不推荐它。

    UnZip


    这是一种使用 7-Zip(命令行可执行文件7z)的方法,它是一种广受信任的工具。恢复原始相对文件路径,这意味着重新创建指向该文件的原始文件夹树。

    7z x -i!"Relative\Path\To\YourDesiredFile.ftw" "YourArchive.zip"
    

    如果您希望将所有松散文件提取到单个目录中,请使用 e 而不是 x。查看the -o switch

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多