Как я могу получить только имена файлов с ошибками из результата ошибки 7Zip в Powershell?

#powershell #parsing #error-handling #7zip

#powershell #Синтаксический анализ #обработка ошибок #7zip

Вопрос:

Я просмотрел много сообщений, но не смог найти ссылку на эту проблему. У меня есть код, который проверяет набор zip-файлов с определенным шаблоном в имени. После тестирования я вижу приведенный ниже формат для файла с ошибками и без ошибок. Я могу проанализировать его с помощью архивов с ошибкой, но я не могу получить имя файла с ошибкой. Моя конечная цель — получить имя файла всех файлов с ошибками из приведенного ниже результата ошибки 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:UsersLozzyDocumentsARDFbrokenCart_Weel_#10-AT_2020-08-06_13268.txt.gz
--
Path = C:UsersLozzyDocumentsARDFbrokenCart_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:UsersLozzyDocumentsARDFbrokenCart_Weel_#210-AT_2020-08-06_13268.txt - Copy.gz
--
Path = C:UsersLozzyDocumentsARDFbrokenCart_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:UsersLozzyDocumentsARDFbrokenCart_Weel_#DT-F@_2020-08-06_13268.txt.gz
--
Path = C:UsersLozzyDocumentsARDFbrokenCart_Weel_#DT-F@_2020-08-06_13268.txt.gz
Type = gzip
Headers Size = 10

Everything is Ok

Size:       504716
Compressed: 56581
  

Ответ №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:UsersLozzyDocumentsARDFbrokenCart_Weel_#10-AT_2020-08-06_13268.txt.gz
--
Path = C:UsersLozzyDocumentsARDFbrokenCart_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:UsersLozzyDocumentsARDFbrokenCart_Weel_#210-AT_2020-08-06_13268.txt - Copy.gz
--
Path = C:UsersLozzyDocumentsARDFbrokenCart_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:UsersLozzyDocumentsARDFbrokenCart_Weel_#DT-F@_2020-08-06_13268.txt.gz
--
Path = C:UsersLozzyDocumentsARDFbrokenCart_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:UsersLozzyDocumentsARDFbrokenCart_Weel_#10-AT_2020-08-06_13268.txt.gz
C:UsersLozzyDocumentsARDFbrokenCart_Weel_#210-AT_2020-08-06_13268.txt - Copy.gz

В регулярном выражении (?im) означает, что сопоставление выполняется без учета регистра и позволяет привязкам ^ или $ совпадать при разрывах строк, поскольку каждый текстовый блок представляет собой многострочную строку.