似乎无法脱离Powershell获取内容命令

似乎无法脱离Powershell获取内容命令,powershell,Powershell,我试着在下面的帖子中使用这个建议 …但是,当我按如下方式运行命令时,“获取内容”命令似乎会继续运行。即,当到达字符串FATAL时,Get内容继续 Get-Content \\n------v\c$\ProgramData\Navis\center\logs\navis-apex.log -wait -Tail 1 | % {$_ ; if($_ -eq "FATAL") {break}} 如果你在逐行阅读,你就不能对照一个单词检查整行内容 Get-Content \\n----v\c$\Pro

我试着在下面的帖子中使用这个建议

…但是,当我按如下方式运行命令时,“获取内容”命令似乎会继续运行。即,当到达字符串FATAL时,Get内容继续

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

如果你在逐行阅读,你就不能对照一个单词检查整行内容

Get-Content \\n----v\c$\ProgramData\Navis\center\logs\navis-apex.log -wait -Tail 1 |
  % {$_ ; if($_ -match "FATAL") {break}}
要检查内容并查看其是否包含单词,请使用-match或-like运算符

注意事项和解决办法

我想补充一点,如果在此之后有代码,它将不会被执行。正如@mklement0所指出的,除了在管道周围使用带虚拟循环的break外,目前还没有办法过早退出管道

解决方法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 \\n----v\c$\ProgramData\Navis\center\logs\navis-apex.log -wait -Tail 1 |
  % {$_ ; if($_ -match "FATAL") {break}}
要检查内容并查看其是否包含单词,请使用-match或-like运算符

注意事项和解决办法

我想补充一点,如果在此之后有代码,它将不会被执行。正如@mklement0所指出的,除了在管道周围使用带虚拟循环的break外,目前还没有办法过早退出管道

解决方法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 $_
        }
    }

这对我来说很好:

Get-Content "\\path_to\log.log" -wait -Tail 1 | % {   
        if($_ -match "FATAL")
        {   write-warning $_
            break
        }
        else
        {   write-host $_
        }
    }

break不是为了退出管道而设计的:在没有封闭循环的情况下,它作为一个整体退出脚本;目前还没有直接的方法可以提前退出管道,尽管添加这样一个特性是一个问题。有限的解决方法是在管道周围使用一个虚拟循环;请参阅。break不是为了退出管道而设计的:在没有封闭循环的情况下,它作为一个整体退出脚本;目前还没有直接的方法可以提前退出管道,尽管添加这样一个特性是一个问题。有限的解决方法是在管道周围使用一个虚拟循环;请参阅。代码中唯一的具体问题可能是将单词FATAL与整行-eq匹配,而不是将其作为行上的子字符串,如Jawad的回答所示。但是,您从链接文章中引用的代码有一个重要的缺陷:break不是为了退出管道而设计的:在没有封闭循环的情况下,它作为一个整体退出脚本-请参阅Jawad的答案,以及更多的背景信息。感谢所有人的回复,这些回复似乎解决了问题:代码中唯一的具体问题可能是将单词FATAL与整行-eq进行匹配,而不是将其作为行上的子字符串,如Jawad的回答所示。但是,您从链接文章中引用的代码有一个重要的缺陷:break不是为了退出管道而设计的:在没有封闭循环的情况下,它作为一个整体退出脚本-请参阅Jawad的答案,以及更多的背景信息。感谢所有人的回复,这些回复似乎解决了问题: