我有一个脚本,其中重命名服务器然后添加到域。
的内容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将其解释为仍然完成。两次重新启动是由于安装了一个窗口功能
这是应用于脚本的正确逻辑,还是解决这些问题的一般方法?
答案 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
}