用于监控文本文件的PowerShell

时间:2015-12-29 18:44:03

标签: powershell wait file-get-contents

我在远程计算机上运行PowerShell脚本。我将数据写入文本文件,因为它完成了它的工作。一旦完成,它就会写一条特定的行。

我在本地PowerShell脚本中有这个来监视远程机器上的那个文件:

Get-Content -Path $Path -Tail 0 -Wait

它工作得很好,但是一旦达到特定的行,我怎么告诉它停止监控?

我厌倦了将它放入do while循环中,但它永远不会释放以完成do while。

以下是我要问的更简单版本的链接:

How to monitor a text file in realtime

第一个答案是好的,但我不想只寻找一条线。我想将它们全部写为VIA Write-Host直到该短语然后从Get-Content中断并继续使用脚本的其余部分。

这是我最终的结果。由于我退出ForEach-Object的方式,它并不漂亮。

Get-Content -Path $path -Tail 0 -wait | ForEach-Object{if($_ -match $word){write-host "- $_" ;cjklnsrvf } else {write-host "- $_"} }

我在上面if语句中使用了try和Catch for cjklnsrvf。这样做是因为ForEach-Object不能使用break或continue语句。似乎在管道ForEach循环时,它将转换为(别名)ForEach-Object cmdlet。 ForEach-Object cmdlet不使用break和continue命令,如foreach循环。

如果在ForEach-Object中使用中断,它将立即退出整个脚本。在一个网站上有一个人通过垃圾带来了循环死亡,它确实在这里工作。

4 个答案:

答案 0 :(得分:0)

Get-Content $path -Tail 0 -Wait | foreach { if ($_ -eq "Specific Line") { Write-Output $_ ; break } }

或者只是break,显然,如果您没有使用输出。

答案 1 :(得分:0)

Do {
    $content = get-content $path -tail 0 -ea 00 | where {$_ -like "*string found*"}
    Sleep -milliseconds 1000
} until($content)

答案 2 :(得分:0)

更新:这是我最终的结果。由于我退出foreach-object的方式,它并不漂亮。

Get-Content -Path $path -Tail 0 -wait | ForEach-Object{if($_ -match $word){write-host "- $_" ;cjklnsrvf } else {write-host "- $_"} } 

我在上面的if语句中使用了try和Catch for cjklnsrvf。这样做是因为ForEach-Object不能使用break或continue语句。似乎在管道ForEach循环时,它将转换为(别名)ForEach-Object cmdlet。 ForEach-Object cmdlet不使用break和continue命令,如foreach循环。如果在ForEach-Object中使用break,它将立即退出整个脚本。在一个网站上有一个人通过垃圾带来了循环死亡,它确实在这里工作。

答案 3 :(得分:-1)

Invoke-Command -ComputerName xxx -Credential $cred -ScriptBlock {if(test-path 'c:\1.txt'){cat 'c:\1.txt'}else{'file not exist'}}