列出ZIP文件的内容

4

我根据tech-recipes的示例成功地列出了ZIP文件的内容(使用7-Zip):

FOR /F "tokens=* delims=" %%A in ('dir /b /s *.zip') do (7z.exe l -r "%%A" >> listing.txt)

然而,这只是将ZIP文件的整个目录结构转储到一个名为“listing.txt”的文本文件中。
我只想列出最高级别目录的目录名称,例如:
Example.Zip
7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Listing archive: C:\Users\Test\Desktop\7zip\Demo.zip

--
Path = C:\Users\Test\Desktop\7zip\Demo.zip
Type = zip
Physical Size = 1252

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2013-04-24 13:12:26 D....            0            0  Directory Three\Sub Folder One
2013-04-24 13:13:00 D....            0            0  Directory Three\Sub Folder Three
2013-04-24 13:12:54 D....            0            0  Directory Three\Sub Folder Two
2013-04-24 13:12:26 D....            0            0  Directory Two\Sub Folder One
2013-04-24 13:13:00 D....            0            0  Directory Two\Sub Folder Three
2013-04-24 13:12:54 D....            0            0  Directory Two\Sub Folder Two
2013-04-24 13:12:26 D....            0            0  Directory One\Sub Folder One
2013-04-24 13:13:00 D....            0            0  Directory One\Sub Folder Three
2013-04-24 13:12:54 D....            0            0  Directory One\Sub Folder Two
------------------- ----- ------------ ------------  ------------------------
                                     0            0  0 files, 9 folders

我只想让文本文件包含以下内容:
- 目录一 - 目录二 - 目录三
有人能提供如何实现这个目标的建议吗?
2个回答

3

看起来7z没有内置此功能的密钥,但是您可以进行一些批处理脚本(此脚本在文件名中搜索斜杠,并在未找到斜杠时显示行):

7z.exe l -r archive.zip > lines.txt

@echo off

setlocal ENABLEDELAYEDEXPANSION

for /f "tokens=*" %%a in (lines.txt) do (
  set line=%%a
  set srch=!line:\=!
  if "!line!" == "!srch!" (
     echo !line!
  )
)

0
7z.exe l -r "File.7z" | FINDSTR "[0-9].D....\>" | FIND /V "\"

使用第一个Findstr筛选输出,获取仅目录(“D”属性)的列表。

使用第二个find从输出中删除包含反斜杠(Folder\Subfolder)的路径。

如何在大量压缩文件中使用它:

@echo off

(For /R %%# in (*.zip) do (

    Echo File: "%%#" | MORE

    For /F "Tokens=5,*" %%A in (
        '7z.exe l -r "%%#" ^| FINDSTR "[0-9].D....\>" ^| FIND /V "\"'
    ) do (
        Set /A "Num+=1"
        Call Echo %%NUM%%.0: %%B
    )

    Set /A "Num=0"
    Echo+

))>"listing.txt"

Pause&Exit

测试结构:

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2013-04-24 13:02:29 ....A          274          167  ..bat
2013-04-24 13:02:29 ....A          274               1\2\2.bat
2013-04-24 13:02:29 ....A          274               a\b\c\c.bat
2013-04-24 13:12:45 D....            0            0  a\b\c
2013-04-24 13:12:37 D....            0            0  a\b
2013-04-24 13:12:33 D....            0            0  a
2013-04-24 13:12:50 D....            0            0  1\2
2013-04-24 13:12:24 D....            0            0  1
------------------- ----- ------------ ------------  ------------------------
                                   822          167  3 files, 5 folders

接收到的输出:

File: "C:\Users\Administrador\Desktop\Nueva carpeta\x.7z" 

1.0: a
2.0: 1

当我运行批处理文件时,我得到一个包含“File:“{filename}.zip””的文本文件。您能告诉我关于令牌中“5”的重要性吗? - JHarley1
脚本运行良好并正确打印文件名,但请用另一个示例解释文件名问题以便更好地理解。令牌是由{空格}(默认情况下)分隔的字符串,因此对于“5,*”令牌,我们将每行分割为5 + 1个字符串。6个令牌,因为有6列,第一列:2013-04-24,第二列:13:12:24,第三列:D....,第四列:0,第五列:0,第六列:**{文件夹名称}**。然后我将第六个令牌打印到文本文件中。 - ElektroStudios
由于某种原因,“原始输出”没有“日期”或“时间” - 这会导致问题吗? - JHarley1
1
如果日期或时间值为空格,那么是有问题的。我本来以为日期/时间列上的所有值都会被填充。拆分行是最好的选择,但这很不方便...让我想想。 - ElektroStudios
但是那个例子有日期和时间值,或者我可能误解了你的意思?如果问题是你不想要第一个文件夹名为“demo”,那么你可以考虑在7zip中压缩并取消选中“保留目录根”选项,然后当列出时,“demo”根将不再出现,脚本将正常运行。 - ElektroStudios
我已按建议更新了ZIP的结构 - 我仍然只得到文件:"C:\Users\Test\Desktop\7zip\Demo.zip"。也许这是我的7-Zip版本的问题。 - JHarley1

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