我有一个日志 file 需要继续监视 file 寻找一些关键字,我创建了一个 PowerShell 脚本并使用带有 -wait
标志的 get-content
命令但是, get-content
只是读取first 关键字,如果我删除 -wait
它将正常工作并读取所有关键字,但它会在完成后退出,我希望 file 继续等待附加的行。
请就此告诉我。
这是我的代码:
$date = Get-date -Format "yyyyMMdd"
$MyError = @('error 1', 'error 2', 'error 3')
$file=$date.log"
foreach ($i in $MyError) {
Get-Content "$file" -Wait | Select-String -Pattern $i -SimpleMatch | ForEach-Object {
if ($i -like 'error 1') {
Write-EventLog -source Test -LogName Test -EventId 1001 -EntryType Error -Message " "
}
if ($i -like 'error 2') {
Write-EventLog -source Test -LogName Test -EventId 1002 -EntryType Error -Message " "
}
if ($i -like 'error 3') {
Write-EventLog -source Test -LogName Test -EventId 1003 -EntryType Error -Message " "
}
}
}
回答1
您的代码的问题是 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.2#-wait 阻塞主线程,无限期等待直到 CTRL+C。因此,你的外层 foreach
只循环一次,所以 $i
总是 error 1
。解决问题的一个简单方法是在 ForEach-Object
中循环,而且使用 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_switch?view=powershell-7.2#syntax 会简化您的代码:
Get-Content path\to\file.txt -Wait | ForEach-Object {
switch -Wildcard ($_) {
'*error 1*' {
# do something for error 1
}
'*error 2*' {
# do something for error 2
}
'*error 3*' {
# do something for error 3
}
}
}