控制台命令仅从存档中提取单个文件? (7z)

Console command to extract only a single file from archive? (7z)

我有一个脚本可以将一个文件夹中的所有档案提取到具有档案名称的文件夹中,我想修改它以便它只从每个档案中提取一个文件(无论哪个档案),它的行为就好像有一个计数器会计算 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-Zip";
7z x *.* -o*

您可以使用

列出存档文件
7z l a.7z

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

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

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

然后使用此答案从行中获取文件名(最后一个词)并将其保存在批处理变量中 FILE_NAME: https://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-Zipz.exe" l %1 > temp.txt
for /f "skip=15 tokens=1-10" %%a in (temp.txt) do (
  echo %%f
  "c:\Program Files-Zipz.exe" e -i!%%f %1 -o*
  goto :end
)
:end
EXIT /B 0

:eof

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

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

unzip "Target.zip" "Target\NMD21-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.