Windows 控制台命令仅从存档中提取单个文件?(7z)
我有一个脚本,可以将文件夹中的所有归档文件提取到具有归档文件名称的文件夹中,我想修改该脚本,使其仅从每个归档文件中提取一个文件(不管是哪一个),它的行为就像有一个计数器将计数1个文件并移动到下一个归档文件一样 例如,假设文件夹中有以下文件,每个归档文件都包含花括号中的内容: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} 因此,运行脚本将导致提取以下内容(这些是文件夹): 这
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