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