Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 控制台命令仅从存档中提取单个文件?(7z)_Windows_Scripting_7zip - Fatal编程技术网

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

Windows 控制台命令仅从存档中提取单个文件?(7z),windows,scripting,7zip,Windows,Scripting,7zip,我有一个脚本,可以将文件夹中的所有归档文件提取到具有归档文件名称的文件夹中,我想修改该脚本,使其仅从每个归档文件中提取一个文件(不管是哪一个),它的行为就像有一个计数器将计数1个文件并移动到下一个归档文件一样 例如,假设文件夹中有以下文件,每个归档文件都包含花括号中的内容: a.7z {folder{1.txt, 2.txt, 3.txt}} b.7z {folder2{4.txt, 5.txt, 6.txt}} c.7z {7.txt} 因此,运行脚本将导致提取以下内容(这些是文件夹): 这

我有一个脚本,可以将文件夹中的所有归档文件提取到具有归档文件名称的文件夹中,我想修改该脚本,使其仅从每个归档文件中提取一个文件(不管是哪一个),它的行为就像有一个计数器将计数1个文件并移动到下一个归档文件一样

例如,假设文件夹中有以下文件,每个归档文件都包含花括号中的内容:

a.7z {folder{1.txt, 2.txt, 3.txt}}
b.7z {folder2{4.txt, 5.txt, 6.txt}}
c.7z {7.txt}
因此,运行脚本将导致提取以下内容(这些是文件夹):

这可能吗

这是我目前拥有的脚本:

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

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

7z l a.7z
如果所有文件都以txt结尾,则可以使用

7z l a.7z | find "txt"
使用此答案获得第一行:

然后使用此答案从行中获取文件名(姓氏),并将其保存在批处理变量file_name中:

然后使用以下命令提取文件:

7z e -i!%FILE_NAME% a.7z -o*
您可以使用此示例来迭代所有*.7z文件

所有部件一起:

@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

归档文件的扩展名可以是任何内容,即使是
zip1
rar1
,其中的文件也可以是任何内容,我希望在提取时将文件夹结构保留在每个归档文件中,但只提取一个文件,而不是全部归档文件。我用更完整的解决方案编辑了答案。我仍然没有找到保持7z文件结构的方法。我认为使用“7ZX”而不是“7ZE”将保留目录结构。此外,您可能需要将双引号和通配符过滤器括起来;e、 g.
“*.pdf”
而不仅仅是
*.pdf
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