如何从 Powershell 中 7Zip 的错误结果中仅获取错误文件名?
How can I get only Error file names from error result of 7Zip in Powershell?
我浏览了很多帖子,但找不到对这个问题的引用。我有一个代码可以测试一组名称中具有特定模式的 zip 文件。测试后,我看到以下错误格式和 none 错误文件。我可以使用 Archives with Error 解析它,但我无法获取错误文件的名称。
我的最终目标是从下面的 7zip 错误结果中获取所有错误文件的文件名。
你能帮我解决这个问题吗?
谢谢
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
我会将此日志的内容拆分为 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)
意味着使匹配工作 case-insensitive 并让 ^
或 $
锚匹配换行符,因为每个text bloxk 是多行字符串。
我浏览了很多帖子,但找不到对这个问题的引用。我有一个代码可以测试一组名称中具有特定模式的 zip 文件。测试后,我看到以下错误格式和 none 错误文件。我可以使用 Archives with Error 解析它,但我无法获取错误文件的名称。 我的最终目标是从下面的 7zip 错误结果中获取所有错误文件的文件名。
你能帮我解决这个问题吗? 谢谢
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
我会将此日志的内容拆分为 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)
意味着使匹配工作 case-insensitive 并让 ^
或 $
锚匹配换行符,因为每个text bloxk 是多行字符串。