使用 PowerShell 的类型 -wait 和 select-string 实时监控应用程序日志的条件并执行操作(如 tail -f 或 watch)
Use PowerShell's type -wait with select-string to Real-Time Monitor an Application Log for a Condition and Execute an Action (like tail -f or watch)
我正在尝试使用 PowerShell 的 type -wait
命令在 Windows 上实时监控日志文件,其方式与我在 Linux 上使用 tail -f
的方式相同,并且我想将文件传输到另一个命令 - select-string
,如 grep
- 这将根据条件触发操作。在 Linux 上,我会使用 watch
来完成我想做的事情。
在下面的示例中,每当将包含字符串 "status=Caught"
的新行写入日志文件时,我将尝试打印短语 "You caught a critter!"
。
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}}
请注意 select-string
命令的 -quiet
参数 returns True
。实际上,在这个例子中,只有 returns True
一次,当我第一次 运行 命令时,因为日志文件有包含字符串 "status=Caught"
.
我确实需要以某种方式忽略现有的字符串(或者,例如,轮换日志文件),但现在,问题是我需要 PowerShell 脚本不仅继续跟踪文件,而且我还需要它继续评估写入文件的每个新行是否包含给定的字符串。然后,如果字符串存在,我需要执行任意操作,比如打印一行;否则,继续监听字符串。
以下 post 表示 -wait
参数是 Get-Content
cmdlet 的一个选项:How to monitor a windows log file in real time? . I am not sure if I should expect -wait
to work with a foreach
loop, as described in this post: 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
,ForEach-Object
中的Write-Host
就会执行
我正在尝试使用 PowerShell 的 type -wait
命令在 Windows 上实时监控日志文件,其方式与我在 Linux 上使用 tail -f
的方式相同,并且我想将文件传输到另一个命令 - select-string
,如 grep
- 这将根据条件触发操作。在 Linux 上,我会使用 watch
来完成我想做的事情。
在下面的示例中,每当将包含字符串 "status=Caught"
的新行写入日志文件时,我将尝试打印短语 "You caught a critter!"
。
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}}
请注意 select-string
命令的 -quiet
参数 returns True
。实际上,在这个例子中,只有 returns True
一次,当我第一次 运行 命令时,因为日志文件有包含字符串 "status=Caught"
.
我确实需要以某种方式忽略现有的字符串(或者,例如,轮换日志文件),但现在,问题是我需要 PowerShell 脚本不仅继续跟踪文件,而且我还需要它继续评估写入文件的每个新行是否包含给定的字符串。然后,如果字符串存在,我需要执行任意操作,比如打印一行;否则,继续监听字符串。
以下 post 表示 -wait
参数是 Get-Content
cmdlet 的一个选项:How to monitor a windows log file in real time? . I am not sure if I should expect -wait
to work with a foreach
loop, as described in this post: 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
,ForEach-Object
中的Write-Host
就会执行