如何从Powershell中7Zip的错误结果中获取错误文件名?

问题描述

我浏览了许多帖子,但找不到对此问题的参考。我有一个代码,用于测试名称中具有特定模式的一组zip文件。经过测试,我看到以下格式的错误和没有错误文件。我可以用 Archives with Error 解析它,但是我无法获得File in Error的名称。 我的最终目的是从下面的7zip错误结果中获取所有错误文件文件名。

可以帮我吗? 谢谢

{{1}}

解决方法

我将在7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30行上拆分此日志的内容,并使用Where-Object过滤其中仅包含Archives with Errors的块。

然后使用正则表达式获取Path =文件名

对于演示,我使用Here-String。 在现实生活中,您可能需要使用以下文件从文件中加载

$zipLog = Get-Content -Path 'The7ZipErrorLog.txt' -Raw

(这里需要-Raw才能在单个多行字符串中获得全部内容)

$zipLog = @"
7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Scanning the drive for archives:
1 file,40021368 bytes (39 MiB)

Testing archive: C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#10-AT_2020-08-06_13268.txt.gz
--
Path = C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#10-AT_2020-08-06_13268.txt.gz
Type = gzip
Headers Size = 10


Sub items Errors: 1

Archives with Errors: 1

Sub items Errors: 1

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Scanning the drive for archives:
1 file,40021368 bytes (39 MiB)

Testing archive: C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#210-AT_2020-08-06_13268.txt - Copy.gz
--
Path = C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#210-AT_2020-08-06_13268.txt - Copy.gz
Type = gzip
Headers Size = 10


Sub items Errors: 1

Archives with Errors: 1

Sub items Errors: 1

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Scanning the drive for archives:
1 file,56581 bytes (56 KiB)

Testing archive: C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#DT-F@_2020-08-06_13268.txt.gz
--
Path = C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#DT-F@_2020-08-06_13268.txt.gz
Type = gzip
Headers Size = 10

Everything is Ok

Size:       504716
Compressed: 56581
"@

$zipLog -split '7-Zip.+Igor Pavlov.+\d{4}-\d{2}-\d{2}' | Where-Object { $_ -match 'Archives with Errors' } | ForEach-Object {
    ([regex] '(?im)^Path = (.+)').Match($_).Groups[1].Value
}

输出:

C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#10-AT_2020-08-06_13268.txt.gz
C:\Users\Lozzy\Documents\ARDF\broken\Cart_Weel_#210-AT_2020-08-06_13268.txt - Copy.gz

在正则表达式中,(?im)表示不使Match工作区分大小写,并让^$的锚点在换行符处匹配,因为每个文本bloxk是多行字符串