![异常发生后循环执行直至失败](https://linux22.com/image/750422/%E5%BC%82%E5%B8%B8%E5%8F%91%E7%94%9F%E5%90%8E%E5%BE%AA%E7%8E%AF%E6%89%A7%E8%A1%8C%E7%9B%B4%E8%87%B3%E5%A4%B1%E8%B4%A5.png)
do
{
Try{
if (New-Object System.Net.Sockets.TCPClient -ArgumentList $server,3389 )
{
Write-Host $server 'Ready for RDP connection'-ForegroundColor Green }
}
catch { write-warning $error[0] }
}until ($? -eq $true)
上面的脚本块在异常后退出,有人能帮忙如何继续直到它得到真的。
答案1
$?
包含最后一个操作的执行状态。它包含 真的如果最后一个操作成功并且错误的如果失败了。
在您的代码中,最后一个操作是(成功的)Write-Warning $error[0]
。
我会Do { … } While ($true)
用break
陈述后Write-Host $server 'Ready for RDP connection -ForegroundColor Green'
如果您坚持使用Until
关键字,则请按如下方式重写代码片段:
do {
$LastSuccess = $true
Try {
if (New-Object System.Net.Sockets.TCPClient -ArgumentList $server,3389 )
{
Write-Host $server 'Ready for RDP connection'-ForegroundColor Green
### here's a possible place for (facultative) break
}
}
catch {
write-warning $error[0]
$LastSuccess = $false
}
} until ( $LastSuccess )
无论如何,我都会将存储New-Object System.Net.Sockets.TCPClient
到变量中。此构造函数将自动尝试连接如果提供了远程主机的主机名和端口号,并且情况是(-ArgumentList $server,3389
)。那么我假设连接是已确立的并且应该在脚本的后面使用以下命令关闭(并释放其资源):Close()
和/或Dispose()
和/或Finalize()
方法。
顺便说一句,if
里面的try
方块绝对是多余的……