powershell - 继续阅读 file,寻找一些关键字

我有一个日志 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
        }
    }
}

相似文章

linux - 从 Centos7/8 迁移到 AlmaLinux 后丢失 dnf

我将CentOS7迁移到8,然后迁移到AlmaLinux,但在此过程中我丢失了dnf和yum。现在我尝试修复,但在依赖项等方面存在很多问题。只有rpm正在工作,所以我必须“手动”完成所有工作。如果我尝...