首页 > 解决方案 > 分配变量后,无法将尾部数据从日志文件打印到 PowerShell 控制台

问题描述

我正在尝试创建一个脚本,通过监视特定关键字的日志文件来在 Windows 应用程序关闭时通知我:

Get-Content <file> -Tail -Wait | Select-String -Pattern <keyword>

我也试过

Get-Content <file> -Tail -Wait | where {$_ -match <keyword>}

我可以使用上面显示的两种变体成功检索告诉我服务器已关闭的关键字Get-Content。我知道它是成功的,因为我看到控制台上显示的关键字行。但是,当我尝试分配变量时:

$var = Get-Content <file> -Tail -Wait | Select-String -Pattern <keyword>
Write-Host $var
$var

它不再在控制台上显示包含字符串的行

这是实际的脚本:

$Downstate = Get-Content -Path "C:\Program Files (x86)\logs\log1.txt" -Tail 1 -Wait |
             Select-String -Pattern "tcp_disconnect"

Write-Host $Downstate

$Downstate

我也试过:

$Downstate = Get-Content -path "C:\Program Files (x86)\logs\log1.txt" -Tail 1 -Wait |
             where {$_ -match "tcp_disconnect"}

我都试过了Write-HostWrite-Content顺便说一句。

分配给变量时没有错误,只是在控制台上看不到输出。但如果我不分配给变量,我可以看到输出。

最终,我想要的是为向上和向下条件分配一个变量,以便当我准备好创建一个在给定条件下执行某些操作的逻辑时,我可以在脚本中引用它们。

标签: windowspowershell-5.0

解决方案


以下方法对我有用:

$infile = 'D:\PShell\DataFiles\so_57360147.txt'    ## my test case
$infile = 'C:\Program Files (x86)\logs\log1.txt'
Get-Content -path "$infile" -Tail 1 -Wait | 
    Select-String -pattern "tcp_disconnect" |
        ForEach-Object { 
            $Downstate = $_
            Write-Host $Downstate -Foreground Cyan ## debugging
            $Downstate                             ## real output
        }

来自Get-Content文档参数的解释:

等待

输出所有现有行后保持文件打开。等待时,Get-Content每秒检查一次文件,如果存在则输出新行。Wait您可以按 CTRL+打断C。如果文件被删除,等待也会结束,在这种情况下会报告非终止错误。

Wait是文件系统提供程序添加到 Get-Contentcmdlet 的动态参数。此参数仅适用于文件系统驱动器。 Wait不能与 结合Raw


推荐阅读