使用 PowerShell 的类型 -wait 和 select-string 实时监视应用程序日志中的条件并执行操作(如尾巴 -f 或监视)



我正尝试使用PowerShell的type -wait命令在Windows上实时监视日志文件,就像在Linux上使用tail -f一样,并且我希望将文件管道传输到另一个命令select-string,如grep,该命令将根据条件触发操作。在Linux上,我会使用watch来完成我想要做的事情

在下面的示例中,每当将包含字符串"status=Caught"的新行写入日志文件时,我都会尝试打印短语"You caught a critter!"

while (1) {if (type -wait "$env:USERPROFILEAppDataRoamingCritterCatcherAppLogsCritterBag-170118.log" | select-string -quiet "state=Caught") {write-host "You caught a critter!"} else {continue}}

请注意,select-string命令的-quiet参数返回True。实际上,在本例中,当我第一次运行该命令时,它只返回True一次,因为日志文件中已有包含字符串"status=Caught"的行。

我确实需要以某种方式忽略现有的字符串(例如,旋转日志文件),但现在的问题是,我不仅需要PowerShell脚本继续跟踪文件,还需要它继续评估写入文件的每一行是否包含给定的字符串。然后,如果字符串存在,我需要执行任意操作,比如打印一行;否则,继续侦听字符串。

以下帖子表明-wait参数是Get-Contentcmdlet的一个选项:如何实时监视windows日志文件。我不确定我是否应该期望-waitforeach循环一起工作,如本文所述:在Powershell中,我可以在foreach语句中使用select string-quiet开关吗。

我如何修改上面的PowerShell脚本来跟踪日志文件,并用给定的字符串为每一行执行一个操作,然后继续跟踪文件并在写入新行时对其求值?

您可以使用Where-Object (?)ForEach-Object (%):在管道上执行此操作

Get-Content file -wait | ? { $_ -match "status=Caught" } | % { Write-Host "You caught a critter!" }

每次在文件中检测到status=Caught时,ForEach-Object中的Write-Host将执行

最新更新