Невозможно выйти из команды Powershell Get-Content

Я попытался использовать предложение в следующем посте;

Как остановить Get-Content -wait после того, как я нахожу определенную строку в текстовом файле с помощью PowerShell?

... но команда Get-Content, кажется, продолжается, когда я запускаю команду следующим образом (имя сервера отредактировано). Т.е. когда достигается строка "FATAL", Get-Content продолжается.

Get-Content \\n------v\c$\ProgramData\Navis\center\logs\navis-apex.log -wait -Tail 1 | % {$_ ; if($_ -eq "FATAL") {break}}

2 ответа

Решение

Если вы читаете по строкам, вы не можете сверить всю строку со словом.

Get-Content \\n----v\c$\ProgramData\Navis\center\logs\navis-apex.log -wait -Tail 1 |
  % {$_ ; if($_ -match "FATAL") {break}}

Вы хотите проверить содержимое и посмотреть, содержит ли оно слово, используйте -match или -like операторы.

Предостережения и обходные пути

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

Get-Content C:\temp\file.txt -wait -Tail 1 | % { if ($_ -match "EXIT") {"found the match"; break;} }
Write-Output "Printing Next Statement" # Will not execute.. script exited already.

#outputs
found the match

обходной путь 1: попробуйте / поймать с помощью оператора throw.

try {
    Get-Content C:\temp\file.txt -wait -Tail 1 | % { if ($_ -match "EXIT") {"found the match"; throw "Exiting loop";} }
}
catch {
    Write-Output "All Contents Retreived."
}

Write-Output "Printing Next Statement"

#Outputs
found the match
All Contents Retreived.
Printing Next Statement

обходной путь 2 Использование фиктивного цикла.

while ($true) {
    Get-Content C:\temp\file.txt -wait -Tail 1 | % { if ($_ -match "EXIT") {"found the match"; break;} }
}
Write-Output "Printing Next Statement"

#outputs
found the match
Printing Next Statement

У меня это хорошо работает:

Get-Content "\\path_to\log.log" -wait -Tail 1 | % {   
        if($_ -match "FATAL")
        {   write-warning $_
            break
        }
        else
        {   write-host $_
        }
    }
Другие вопросы по тегам