我正在尝试使用 PowerShell 的 type -wait
命令在 Windows 上实时监控日志文件,方式与我使用的方式相同 tail -f
在 Linux 上,我想将文件通过管道传输到另一个命令 - select-string
, 喜欢 grep
- 这将根据条件触发操作。在 Linux 上,我会使用 watch
完成我正在尝试做的事情。
在以下示例中,我尝试打印短语 "You caught a critter!"
每当包含字符串 "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-Content
的一个选项cmdlet:How to monitor a windows log file in real time? .我不确定我是否应该期待 -wait
与 foreach
一起工作循环,如本文所述:In Powershell can i use the select-string -quiet switch within a foreach statement .如何修改上述 PowerShell 脚本以尾随日志文件并使用给定字符串对每个新行执行操作,并继续尾随文件并在新行写入时对其进行评估?
最佳答案
您可以使用 Where-Object (?)
在管道上执行此操作和 ForEach-Object (%)
:
Get-Content file -wait | ? { $_ -match "status=Caught" } | % { Write-Host "You caught a critter!" }
每次
status=Caught
在文件中检测到 Write-Host
在 ForEach-Object
将执行
关于powershell - 使用 PowerShell 的类型 -wait 和 select-string 实时监控应用程序日志的条件并执行操作(如 tail -f 或 watch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722827/