【问题标题】:restart computer on all hosts at the same time同时重启所有主机上的计算机
【发布时间】:2017-12-12 22:36:41
【问题描述】:

我想重新启动清单中的所有主机/虚拟机。 我创建了一些简短的脚本,这些脚本会逐个重新启动主机。 但是需要很长时间。我怎样才能让所有主机同时重新启动?

我的代码:

foreach ($host in $hosts) {
    Restart-Computer -ComputerName $host -Wait
    Write-Host "$host restarted "
}

【问题讨论】:

  • 除非您的主机数量可以忽略不计,否则您绝对不希望同时重新启动所有计算机(虚拟或物理)。它会给主机操作系统或电源带来巨大压力。我想说最好的方法是通过job queue 分批重启系统。

标签: powershell


【解决方案1】:

Restart-Computer 将接受 ComputerName 的多个条目,因此您可以一次在多个主机上执行重启。

使用它,您可以分批启动重启,比如一次三个,这将显着减少所需的时间,而不会在 VM 集群/主机上增加太多负载。

$hosts = @("server01","server02","server03","server04","server05","server06","server07","server08","server09","server10")

[int]$batches = 3 #number of computers to restart in each 'batch'
[int]$skip = 0

do {
    $selected_hosts = $hosts | Select-Object -First $batches -Skip $skip

    Restart-Computer -ComputerName $selected_hosts -Wait -WhatIf
    Write-Host "$selected_hosts restarted"

    $skip = $skip + $batches
}
while ($selected_hosts)

注意:当您准备好实时运行脚本时删除-WhatIf,这样Restart-Computer 只会写信给控制台,通知您它将做什么而不是实际执行重新启动。

【讨论】:

    【解决方案2】:

    这是个好主意吗? - 重启-计算机-asJob 或者也许是更好的解决方案??

    $j = Restart-Computer -ComputerName "Server01", "Server02" -AsJob
    PS C:\> $Results = $j | Receive-Job
    PS C:\> $Results
    

    【讨论】:

    • 为什么工作是更好的解决方案?他在寻找并行解决方案吗?
    • @RanadipDutta:好吧,如果您阅读了他们的问题,那么听起来肯定是这样。
    • 我的错。你说的对。虽然我更喜欢对所有服务器使用 start-process 。
    【解决方案3】:

    您可以尝试WMI 重新启动服务器吗?我在social.technet.microsoft 论坛上找到了一种这样的方法。

    $server = get-content c:\Servers.txt
    
    (gwmi -Class Win32_OperatingSystem -ComputerName $server).Win32Shutdown(6)
    If ($?) {
    Write-Host "$server successfully rebooted"
    }Else{
    Write-Host "Could not reboot $server"
    }
    

    您还可以找到其他方法,例如使用批处理文件。查看this 链接。

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多