我需要完善此脚本。我需要它在多个(5个-都在同一位置的日志文件)Windows系统上运行。我很难弄清楚如何确保可以同时“尾部”所有5台服务器上的条目的日志并返回“ OK”;仅在所有5台服务器上都生成日志条目时才终止作业,而不仅仅是说其中4台。
这是要做什么:
$waitfor
)$serviceB = "my application service"
$logfile2 = "F:\App\log\wrapper.log"
$waitFor = "[4.2.3.GA (build: SVNTag=JBoss_4_2]”
Write-Host "Starting $serviceB"
Start-Service $serviceB
Write-Host "Waiting for $waitFor in $logfile2"
while (!((Get-Content $logfile2 -Tail 30) | ? {$_ -match $waitFor})) {
Start-Sleep -Seconds 5
}
如何使用foreach
循环来完成-拖尾并等待CSV文件中所有5个远程系统上的日志输入?
答案 0 :(得分:2)
简而言之,不能一次不在同一会话中,而是一次全部。每个日志必须位于其自己的会话中。我怎么知道,因为我花了很多时间来尝试实现这一目标。好吧,您可以一次只配置一台服务器,完成后使用循环将其移至下一台服务器。
您可以使用for循环命中每个服务器主机,但是您需要为每个服务器主机弹出一个单独的PowerShell实例。
好吧,您可以在一个控制台会话中,一次只处理一台服务器,等待该服务器完成,让其向您发送消息,然后在完成时使用循环转到下一个服务器。但是,如果找到该字符串需要一段时间,则就像看着油漆变干一样。
foreach ($RemoteHost in (Import-Csv -Path 'D:\Temp\serverlist.csv'))
{
# You code here
Invoke-Command -ComputerName $RemoteHost -Credential 'domain\adminname' -ScriptBlock {
# the rest of your code here:
}
}
既然您说的是远程主机,那么这意味着您需要为它们启用PSRemoting,以利用隐式删除会话并使用远程主机本地管理员组中的帐户。
您可以使用-tail -wait,也不需要执行“开始睡眠”和“抓线”步骤。
使用-tail -wait,将在创建条目时在写入每个条目行时显示日志。
Get-Content -Path $CurrentHostLog.FullName -Tail 0 -Wait
因此,尽管我不太确定为什么您要-tail this并观看这些日志滚动,因为您只是在寻找简单的字符串
恕我直言,我建议您同时并行启动每个后台作业,并让该作业提醒您;文字,电子邮件,屏幕警报等,当他们返回您想要的结果时。