-2

Это концептуальный вопрос, который я только кратко обдумал. У меня есть идея, как я могу это сделать, но мне кажется, что это сложнее, чем я думаю.

Общей необходимостью является поиск в файле (например, может быть журнал ошибок), и я хочу найти в этом файле одно конкретное строковое значение. Однако в моем случае я подумал, что некоторые приложения выдают ошибку в одной строке, но строка, содержащая текст ошибки, может находиться в исходной или предшествующей строке этого журнала (например, журналы ошибок SQL Server). Поэтому в этом случае я мог бы захотеть включить найденную строку с конкретной строкой, предоставленной в поиске, но включить строку (или даже строки) до и после нее.

Я стараюсь сделать свои сценарии максимально простыми для удобства чтения другими пользователями, которые могут их использовать или найти. Я не могу думать в своей голове, это было бы легко написано.

РЕДАКТИРОВАТЬ

Основываясь на ответе, предоставленном с использованием Select-String это пример того, что я пытаюсь сделать:

[void][System.Reflection.Assembly]::[LoadWithPartialName]('Microsoft.SqlServer.SMO')
$s = New-Object Microsoft.SqlServer.Management.Smo.Server MyServer
$s.EnumErrorLogs() | select -ExpandProperty Name | 
foreach { $s.ReadErrorLog($_) | select-string -Pattern "*Serverity: 25*" -Context 3 -SimpleMatch | 
select LogDate, ProcessInfo, Text

1 ответ1

4

Командлет Select-String с -Context в значительной степени идеально подходит для того, что вы пытаетесь сделать ... Это будет читать содержимое файла и искать строку, возвращая 3 строки выше и ниже строки:

$file = C:\Users\Public\Documents\log.txt
$string = "*error*"
Get-Content $file | Select-String $string -Context 3 -SimpleMatch

По умолчанию Select-String использует регулярные выражения, но -SimpleMatch будет выполнять поиск в виде простого текста.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .