3

我正在尝试使用 PowerShell 的type -wait命令在 Windows 上以与在 Linux 上使用相同的方式实时监控日志文件tail -f,并且我想将文件通过管道传输到另一个命令 - select-string,比如grep- 这将触发基于 a 的操作健康)状况。在 Linux 上,我会用它watch来完成我想做的事情。

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

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

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

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

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

如何修改上述 PowerShell 脚本以跟踪日志文件并使用给定字符串对每个新行执行操作,并继续跟踪文件并在编写新行时对其进行评估?

4

1 回答 1

3

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

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

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

于 2017-01-18T15:31:53.763 回答