有没有办法避免在使用Restart-Computer时使用大量的Start-Sleep?

时间:2016-12-08 13:10:51

标签: powershell

我有一个脚本,其中重命名服务器然后添加到域。

的内容
Rename-Computer -ComputerName $ComputerIP -NewName $newComputerName -LocalCredential $LocalCredential -Verbose  
Start-Sleep -s 5

Add-Computer -ComputerName $ComputerIP -DomainName $DomainName -LocalCredential $LocalCredential -Options JoinWithNewName,AccountCreate -Credential $DomainCredential -force -Verbose -Restart 

Start-Sleep -s 60

重命名服务器后,我必须添加一个" Start-Sleep -s 5"确保计算机在准备好之前未添加到域中等等。

在服务器进入域后,我必须添加一个Start-Sleep -s 60,以确保下一部分不会过早执行。我尝试使用-Wait来确保服务器等到重启后才能继续,但这会因为重启两次而失败。注意:在第一次重新启动后,它永远不会进入登录屏幕,但是powershell将其解释为仍然完成。两次重新启动是由于安装了一个窗口功能

这是应用于脚本的正确逻辑,还是解决这些问题的一般方法?

4 个答案:

答案 0 :(得分:1)

也许它会有所帮助:

使用不带-restart参数的Add-Computer,之后可以使用

Restart-Computer -ComputerName $ ComputerIP -Wait -For PowerShell

您还可以等待-WMI或-WinRM

答案 1 :(得分:0)

为此,您可以使用do-while。

因此逻辑将是启动 - 睡眠仅1秒并且直到满足条件。在您的情况下,条件是检查服务器是否正在ping或某些状态检查。 这意味着,每次等待1秒钟,直到系统启动。

它只是逻辑。您可以根据您的要求实施。

Do { Start-sleep 1 } 
while(Test-Connection -ComputerName $Computername)

希望它有所帮助。

答案 2 :(得分:0)

您无需使用Rename-Computer,您可以使用NewName参数完成重命名并加入Add-Computer,如下所示:

Add-Computer -ComputerName $Computer -NewName $newComputerName -DomainName $DomainName -LocalCredential $LocalCredential -Credential $DomainCredential

这简化了您的脚本只需重启一次。

答案 3 :(得分:0)

以下脚本轮询 WMI RPC 以确定计算机何时已准备就绪,没有直接的方法可以执行此操作。你可以使用System.Net类编写自己的方法。

function WaitForWMI{
         Param(
               $computername
         )
         $msg='Timed out after {1:N0} seconds connecting to {0}.  Trying again'
         $starttime=[datetime]::Now
         While(!(GWMI Win32_Bios -computername $computername -ea 0)){
               Write-Host ( $msg -f $computername, $([datetime]::Now -$starttime).TotalSeconds) -fore green
         }
          Write-Host ('Host {0} conncted at {1}'  -f $computername, [datetime]::Now) -fore blue -back white
    }