powershell - 使用 PowerShell 的类型 -wait 和 select-string 实时监控应用程序日志的条件并执行操作(如 tail -f 或 watch)

标签 powershell scripting watch tail select-string

我正在尝试使用 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? .我不确定我是否应该期待 -waitforeach 一起工作循环,如本文所述: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-HostForEach-Object将执行

关于powershell - 使用 PowerShell 的类型 -wait 和 select-string 实时监控应用程序日志的条件并执行操作(如 tail -f 或 watch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722827/

相关文章:

internet-explorer - 让 powershell 进入 ie 类,并在 ui 测试期间截取 ie 窗口的屏幕截图

arrays - 如何反转pscustomobject的属性?

linux - 通过计时器限制 WGET'ing,如何做到这一点?

javascript - 为什么 JavaScript 被称为 "scripting language"?

python - 如何在 powershell 中搜索字符串并删除该行?

javascript - 使用 ControllerAs 语法与服务变量绑定(bind)而不使用 $scope?

c - 如何从带有通配符的字符串中获取Appx全名?

powershell - 根据数据类型使用获取内容

node.js - 监视创建的文件的文件夹并使用 Node RED 将创建的文件上传到服务器

c# - 找不到类型的构造函数;在 watch 中工作