我找到了一个 Powershell 脚本,它可以检查 Windows 服务器上的所有自动服务,如果它们未启动,则尝试启动它们。以下是链接http://doitcloudy.blogspot.de/2014/07/scriptgesteuerter-neustart-von-windows.html(它是德语,但页面底部的脚本都是英语)。我想对其进行一些自定义。但是,我需要一些这部分的帮助(第 130 行及以下):
foreach ($item in $report){
Write-Host "Starting Service " $item.Name " on server: " $item.Server -Foregroundcolor yellow
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
if ($j.State -ne 'Running') { break}
$j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
}
我看到这是脚本启动服务的部分,但我不习惯 Powershell 中的“作业”。我应该如何编辑脚本,以便在启动服务失败时将服务名称写入日志文件?也许使用 try/catch?
任何帮助是极大的赞赏!
答案1
在第 103、123 和 137 行休息前写入您的日志。
因此改变
if ($j.State -ne 'Running') { break}
到
if ($j.State -ne 'Running') { Add-Content c:\log.txt "$item Did not Start" ; break}
答案2
如果有人偶然发现这个问题并想知道我是如何解决的:经过大量研究,我发现将 Receive-Job 的输出写入日志文件极其困难。所以我选择了一种不同的方法:我在作业完成后检查服务器是否正在运行。以下是代码:
foreach ($item in $report){
Write-Output "Starting Service " $item.Name " on server: " $item.Server
$start = Get-Date
$startSVCblock = {param($item) Start-Service -InputObject (Get-Service -ComputerName $item.Server -Name $item.Name)}
$j = Start-Job -ScriptBlock $startSVCblock -Arg $item
do {
if ($j.State -ne 'Running') { break}
$j | Receive-Job
} while (((Get-Date) - $start) -le $timeout)
$newService = Get-Service -ComputerName $item.Server -Name $item.Name
if ($newService.Status -ne "Running") { LogWrite "$item could not start" }
}