PS 监控日志文件并使用最新条目更新变量

PS Monitor Log File and update Variable with Latest Entry

我正在尝试监控一个日志文件的最新条目,然后将输出传递给一个变量,这样我就可以做其他事情了,对于这个例子,我只是要在控制台中弹出一条消息。

$fail = Get-Content 'C:\ProgramData\Software\APP.LOG' -Tail 0 -Wait | Select-String 'Error Alert Entry'
if ($fail -contains 'Error Alert Entry'){Write-Host "Warning Will Robinson!"}

我已经单独测试了 Get-Content 命令,它可以毫无问题地跟踪日志文件的输出,但是当设置为变量时,我什么也得不到。

我还测试了后一部分,当我使用类似这样的方法手动定义 $fail 变量时,这有效:

$fail = 'Error Alert Entry'

变量似乎不喜欢通过主动拖尾日志文件来填充。如果有人可以就如何克服这个问题提供一些指导,我将不胜感激。

有时您必须用 PS 检查您的假设。试试这个:

$fail

然后是这个:

$fail.GetType()

现在这个:

$fail[0].GetType()

你以为是String的数组,实际上是Select-String返回的MatchInfo的数组。你应该能够通过从 MatchInfo 对象中挖掘 Value 来得到你想要的东西:

$fail.matches.value -contains 'Error Alert Entry'

或者你可以把第一行的值挖出来:

$fail = (Get-Content 'C:\ProgramData\Software\APP.LOG' -Tail 0 -Wait | Select-String 'Error Alert Entry').Matches.Value

我不得不承认,Get-Content -Tail 0 -Wait 似乎在我的环境中不起作用。尽管对文件进行了更改,但该命令似乎无限期挂起。

/编辑

好的,我想我现在明白了。 Get-Content -Tail 0 -Wait 永远不会退出,因此它永远不会完成将输出传输到 Select-String 并且永远不会允许 $fail 接收数据。

一个解决方案可能是将你的 Get-Content -Tail 0 -Wait 包装在一个作业中并循环一个 Receive-Job 调用来执行你的 Write-Host 'Warning Will Robinson!'