我们想在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 $_}
任何帮助将不胜感激。
答案 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'
的行