Отобразить все сообщение об ошибке из файла журнала с помощью powershell

#powershell

#powershell

Вопрос:

Один из пакетных сценариев создает файл журнала, и в нем могут быть сообщения об ошибках, как показано ниже

 Msg 2714, Level 16, State 1:
Server 'ABC', Procedure 'proc_test1', Line 189:
There is already an object named 'table_test' in the database.
Msg 207, Level 16, State 4:
Server 'ABC', Procedure 'proc_test2', Line 197:
Invalid column name 'employee'.
Msg 207, Level 16, State 4:
Server 'ABC', Procedure 'proc_test2', Line 197:
Invalid column name 'address'.

  

Использование сценария powershell для чтения ошибок и отправки сообщений об ошибках на почту из файла журнала. И я использую это, что также исключает определенные предупреждающие сообщения.

 Select-String -Path 'C:UsersBatchLog_20200911.txt' -Pattern "Msg","Error" | Select-String -Pattern "SQLState = S1000, NativeError = 0" -notmatch | select-object -Property Line,LineNumber

  

Вывод выглядит следующим образом

 Line                                                                                                                LineNumber
----                                                                                                                ----------
Msg 2714, Level 16, State 1:                                                                                              2791
Msg 207, Level 16, State 4:                                                                                               2794
Msg 207, Level 16, State 4:                                                                                               2797
CT-LIBRARY error:                                                                                                         2828
    ct_results(): network packet layer: internal net library error: Net-Library operation terminated due to disconnect       2829
"Errors encountered during execution.  Exited with status: 596"                                                           4168

  

Таким образом, он просто печатает строку, соответствующую запросу. Я хочу напечатать следующие строки с фактическим описанием сообщения об ошибке. Любой совет здесь. Спасибо.

Ответ №1:

Используйте -Context параметр командлета Select-String :

 Select-String -Path 'C:UsersBatchLog_20200911.txt' "Msg","Error" -Context 0,1 | 
  ForEach-Object { 
    if ($_.Context.PostContext[0] -notmatch 'SQLState = S1000, NativeError = 0') {
      [pscustomobject] @{
        Line = $_.Context.PostContext[0]
        LineNumber = $_.LineNumber
      }
    }
  }
  
  • -Context 0,1 захватывает 0 строки до и 1 после строки вместе с фактически совпадающей строкой.

  • В результирующем Microsoft.PowerShell.Commands.MatchInfo экземпляре .Context.PostContext[0] предоставляет доступ к первой постконтекстной (after) строке.

С вашим примером ввода приведенное выше дает:

 Line                                            LineNumber
----                                            ----------
Server 'ABC', Procedure 'proc_test1', Line 189:          1
Server 'ABC', Procedure 'proc_test2', Line 197:          4
Server 'ABC', Procedure 'proc_test2', Line 197:          7
  

Комментарии:

1. Спасибо за вашу помощь @mklement0

2. Рад слышать, что это было полезно, @Kris.