如何在Powershell中为特定字符串尾部记录文件

时间:2014-10-24 09:37:58

标签: powershell tail

我们想在powershell中为特定字符串“生存”几个日志文件。我们尝试使用“get-content”命令,但没有运气,因为每次我们只收到一个文件的结果。我假设它是由“-wait”参数引起的。如果还有其他方法来拖尾多个文件?我听说过运行空间,但我仍然不知道如何实现它。

我们的示例脚本

dir d:\test\*.txt -include *.txt | `
Get-Content -Wait | `
select-string "windows" | `
ForEach-Object {Write-EventLog -LogName Application -Source "Application error" -EntryType information -EventId 999 -Message $_}

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我能想到的唯一方法就是创建一堆在每个文件上运行命令的作业。然后,您可以循环接收作业输出,并将任何文件中的更改写入屏幕:

gci d:\test\*.txt | % { $sb = [scriptblock]::create("get-content -wait $_") ; start-job -ScriptBlock $sb }
while(1) { 
  $m = $(get-job | receive-job | select-string "searchstring") 
  if($m -ne $null) { 
     Write-EventLog -LogName Application -Source "Application error" -EntryType information -EventId 999 -Message $m
  }
  sleep 1 
}

答案 1 :(得分:0)

派对可能会稍晚......

根据here,我们可以在.ps1文件中使用以下内容;

$ProgressPreference='SilentlyContinue'
Workflow My-Tail
{
    Param([string[]] $Path)

    foreach -parallel ($file in $path)
    {
        Get-Content -Path $file -Tail 1 -Wait
    }
}

这允许我们拖尾多个文件,在powershell中调用;

My-Tail (dir C:\Users\User\Documents\*.log)

然后剩下的就是按要求的字符串过滤;

My-Tail (dir C:\Users\User\Documents\*.log) | Select-String -Pattern ".*ERROR.*"

这将拖尾所有以文件中的.log结尾的文件,输出包含文字' ERROR'

的行