我正尝试使用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-Content
cmdlet的一个选项:如何实时监视windows日志文件。我不确定我是否应该期望-wait
与foreach
循环一起工作,如本文所述:在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
将执行