You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:06:30