PowerShell批量重启多台计算机:如何获取结果及记录日志?
解决批量重启服务器的PowerShell脚本问题
首先你原脚本存在一个关键错误:foreach循环遍历的是$VMs,但执行Restart-Computer时传入的是$Servers,这会导致每次循环都重启所有服务器,而非单台目标机器。修正后的基础脚本如下:
foreach ($vm in $Servers) { try { Restart-Computer -ComputerName $vm -Force -Wait -ErrorAction Stop Write-Output "$vm 重启成功" } catch { Write-Output "$vm 重启失败:$_" } }
1. 将重启结果导出到数组或日志
存储到数组
初始化空数组,每次循环将自定义结果对象存入,方便后续批量处理:
$restartResults = @() foreach ($vm in $Servers) { $result = [PSCustomObject]@{ ServerName = $vm Status = $null ErrorInfo = $null Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' } try { Restart-Computer -ComputerName $vm -Force -Wait -ErrorAction Stop $result.Status = "成功" } catch { $result.Status = "失败" $result.ErrorInfo = $_.Exception.Message } $restartResults += $result } # 查看结果数组 $restartResults
导出到日志文件
可以直接追加到文本日志,或把数组导出为CSV(更适合后续分析):
# 导出为CSV格式 $restartResults | Export-Csv -Path "C:\ServerRestartLog.csv" -NoTypeInformation -Encoding UTF8 # 追加到文本日志 foreach ($vm in $Servers) { try { Restart-Computer -ComputerName $vm -Force -Wait -ErrorAction Stop "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $vm | 重启成功" | Out-File "C:\ServerRestartLog.txt" -Append -Encoding UTF8 } catch { "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $vm | 重启失败:$($_.Exception.Message)" | Out-File "C:\ServerRestartLog.txt" -Append -Encoding UTF8 } }
2. 如何知晓服务器重启失败
- 使用
try/catch捕获异常:$_变量会包含具体错误信息(如网络不可达、权限不足等) - 检查
$?自动变量:若为$false,表示上一条命令执行失败,但无法获取详细错误,仅作快速判断 - 查看
$Error自动变量:存储了所有执行过程中的错误,可通过筛选找到对应服务器的报错记录
3. 脚本是否会继续运行
默认情况下,Restart-Computer报错时不会终止整个脚本,仅输出错误信息后继续执行下一台。
- 若设置
-ErrorAction Stop但未搭配try/catch,脚本会在遇到第一个错误时终止 - 若搭配
try/catch,即使设置了-ErrorAction Stop,捕获错误后脚本仍会继续处理剩余服务器
4. -AsJob参数的用法说明
-AsJob将重启操作放入后台作业运行,支持并行处理多台服务器(无需等待单台完成再启动下一台),虽然和-Wait不兼容,但可通过Wait-Job和Receive-Job管理作业并获取结果:
# 批量启动重启作业 $jobs = $Servers | ForEach-Object { Restart-Computer -ComputerName $_ -Force -AsJob } # 等待所有作业完成 Wait-Job -Job $jobs # 获取作业执行结果 $jobResults = Receive-Job -Job $jobs # 遍历结果输出状态 foreach ($result in $jobResults) { if ($result.Succeeded) { Write-Output "$($result.ComputerName) 重启成功" } else { Write-Output "$($result.ComputerName) 重启失败:$($result.Error)" } } # 导出作业结果到CSV $jobResults | Export-Csv -Path "C:\RestartJobResults.csv" -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

