问题描述
我浏览了许多帖子,但找不到对此问题的参考。我有一个代码,用于测试名称中具有特定模式的一组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是多行字符串