Кажется, не может выйти из команды Powershell Get-Content - PullRequest
1 голос
/ 21 февраля 2020

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

Как остановить Get-Content -подождать, когда я найду определенную строку в текстовом файле, используя 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}}

enter image description here

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

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

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

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

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

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

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: try / catch с оператором 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 Использование пустышки l oop.

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
1 голос
/ 21 февраля 2020

Это хорошо работает для меня:

Get-Content "\\path_to\log.log" -wait -Tail 1 | % {   
        if($_ -match "FATAL")
        {   write-warning $_
            break
        }
        else
        {   write-host $_
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...