2013-01-04 48 views
1

我有一個腳本,做一些服務器維護。部分工作是停止並重新啓動主機服務器上的服務。告知服務何時完全重新聯機的最簡單方法是嘗試連接到管理端口。一旦你能夠連接到管理端口,服務就緒並準備就緒。夠簡單。這段代碼中循環,直到它重新聯機:PowerShell的錯誤捕獲

function test-port { 
$PortProbe = New-Object Net.Sockets.TcpClient 
$ErrorActionPreference = "SilentlyContinue" 

while ($PortProbe.Connected -eq 0){ 
$PortProbe.Connect("localhost",3041) 
write-host "Server is off line... waiting for it to come online." 
sleep 1 

} 
write-host "Server is back online!" 
$ErrorActionPreference = "Continue" 
$PortProbe.Close() 
} 

test-port 

所以在我的劇本我做我的工作,重新啓動服務,然後調用「測試端口」有腳本等待服務恢復聯機在繼續之前。

我遇到的問題是,如果我在腳本的通用陷阱,當端口還沒有準備好它捕獲連接錯誤。

Exception calling "Connect" with "2" argument(s): "No connection could be made because the target machine actively refused it 127.0.0.1:3041" 
At line:6 char:27 
+   $PortProbe.Connect <<<< ("localhost",3041) 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 

我有在某些情況下確實奇怪的錯誤發生在年底陷阱聲明,它會揭開序幕的電子郵件警報。但它打破了測試端口功能的功能。

從理論上講,我可以捕獲這個特定的TCP/IP連接錯誤,並告訴它只是繼續像什麼也沒有發生,但我不知道如何告訴類的錯誤信息是什麼。我認爲它會是這樣的:

trap [Net.Sockets.TcpClient] { #Don't Panic 
} 

但這是不對的。

有什麼建議嗎?我需要完全不同的處理方式嗎?

回答

0

而不是下降到插座,爲什麼不使用Get-Service命令用一個循環來檢查服務的狀態例如爲:

do { 
    $svc = Get-Service -ComputerName Localhost w3svc 
    $connected = $false 
    if ($svc -and $svc.Status -eq 'Running')  { 
     $connected = $true 
    } 
    Start-Sleep -Milliseconds 500 
} while (!$connected)