PowerShell, если следующая строка содержит «эту строку», выводит текущую строку и следующие 3 строки, иначе выводит только текущую строку - PullRequest
0 голосов
/ 04 марта 2020

(извините за плохой английский sh) Мне нужен скрипт PowerShell, который делает =, если следующая строка содержит «эту строку», выводит текущую строку и следующие 3 строки, иначе выводит только текущую строку. например,

Информация об ошибке Ошибка Ошибка исключения Ошибка

, если в следующей строке нет строки 'исключение', вывести ошибку только в файле Excel, но если следующая строка в строке ошибки содержит исключение, вернуть строку ошибки + следующие 3 строки

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Что вы искали?

Существует множество примеров этого варианта использования по всей сети и прямо здесь, на SO. Люди здесь рады помочь, но вы должны показать усилия, код и ошибки.

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

Просто найдите ...

'PowerShell выберите строку и следующие 3 Строки '

... и всегда читайте файлы справки , не предполагайте и не предполагайте, в данном случае, командлеты Get-Content или Select-String

# Help topics 
Get-Help about_*

# get function / cmdlet details
Get-help -Name Get-Content -Full
Get-help -Name Select-String -Full

... и просмотреть переключатель -Context info и примеры. А также файлы справки по условным логам c, т. Е. If / then.

PowerShell: выбор строки, предшествующей совпадению - проблема Select-String -Context при использовании входной строковой переменной

Чтение текстового файла с -context

Прочитайте обсуждение и посмотрите ответ.

Итак, ваш вопрос может почти считается дубликатом потока SO, описанного выше, хотя он выглядит наоборот, что означает, что вам просто нужно переключить направление, как во втором примере.

Обновление

ОК, так как вы только что опубликовали какой-то код (хотя всегда обновляйте свой вопрос кодом, вместо того, чтобы помещать его в раздел комментариев, чтобы было легче следить за ним и чтобы люди могли разобраться) показывая, что вы идете по правильному пути, это действительно так просто:

# Example
@'
line1
line2
line3
line4
line5
'@ | Out-File -FilePath 'D:\temp\FileWithLines.txt'

Get-Content -Path 'D:\temp\FileWithLines.txt' | 
Select-String -Pattern line2 -Context 0,3

<#
# Results

> line2
  line3
  line4
  line5
#>

Get-Content -Path 'D:\temp\FileWithLines.txt' | 
Select-String -Pattern line1 -Context 0,3
<#
# Results

> line1
  line2
  line3
  line4
#>

If (Get-Content -Path 'D:\temp\FileWithLines.txt' | Select-String -Pattern line0)
{
    Get-Content -Path 'D:\temp\FileWithLines.txt' | 
    Select-String -Pattern line1 -Context 0,3
}
Else 
{
    Write-Warning -Message "Current line is 
    $(Get-Content -Path 'D:\temp\FileWithLines.txt' | 
    Select-String -Pattern line1)"
}
<#
# Results

WARNING: Current line is 
    line1
#>
0 голосов
/ 04 марта 2020

Попробуй так:

# get file content as an array
$lines = Get-Content "filepath"
$line = 0
# read lines one by one
$lines | foreach {
  # increment line counter
  $line++
  if ($_ -match ".*(This string).*") {
    # Line matched show current line and next 3 lines from $lines array
    $_
    $lines[$line..($line+3)]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...