#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.