首页 > 解决方案 > 找到字符串后使用 Powershell 将内容添加到文本日志文件

问题描述

当文件中的模式匹配时,此代码无法成功将日期附加到平面文本文件。已验证已找到该模式,但无法使添加内容发挥作用。注意:使用等待是为了等待关键字 = Idle 被写入文件。

我的代码在这里:

$File = "AutoDE45oService_AP.$(get-date -Format yyMMdd).log"
        $Path = "C:\Users\user"
        $result = Get-ChildItem $Path -recurse | Where-Object { $_.Name -match $File } 
        $containsIdle = Get-Content $result.FullName -Tail 1 -Wait | Select-string -Pattern "Idle" -Quiet 
        If($containsIdle -contains $true)
{
    Add-Content $result.FullName -Value (Get-Date) -PassThru

    }

标签: powershell

解决方案


与结合没有意义:Get-Content -WaitSelect-String -Quiet

  • Get-Content -Wait无限期地等待将新内容添加到目标文件(如果有)。等待仅在特殊情况下停止,即目标文件被删除、重命名或移动时。

  • Select-String -Quiet只输出一个布尔值,指示是否找到该模式 - 即使附加输入包含该模式。

因此,结合这两个调用:

  • 只产生最多一个输出值 - 即$true- 对于找到的模式的第一次出现 - 即使稍后添加到文件的内容也与模式匹配。

  • 无限期地运行(除非您删除、重命名或移动目标文件)。


要解决您的问题,您需要两件事:

  • 在同一管道的一部分中省略-Quiet并处理结果:ForEach-Object

    Get-Content -Wait ... | Select-String -Pattern ... | ForEach-Object { ... }
    
  • 提供一个外部机制来终止命令以防止它无限期地运行:

    • 交互式运行时,按下会Ctrl-C终止执行。
    • 有关基于超时的自动终止机制,请参阅此答案(针对您的相关问题)。

推荐阅读