2012-02-01 67 views
3

我的腳本中有以下代碼片斷,它使用WebRequest來ping一系列Web /應用程序服務器,並且我得到隨機結果,這些結果是根據好/壞服務器列在服務器列表。PowerShell的隨機WebRequest結果

例如,如果壞的服務器(我得到404或503的代碼)列在列表中的第一個,那麼我的腳本似乎準確報告。但是,如果優先服務器(返回狀態=「確定」)被首先列出,那麼我的結果是不準確的。

這裏是我的代碼片段:

$ServerList = gc "$pwd\servers\test_servers.lst" 
ForEach ($_ in $ServerList) 
{ 
# Ping web server test 
$url = "http://$_.domain.net/logon" 
Write-Host "Pinging web address for server: $url ..." 
$request = [System.Net.WebRequest]::Create($url) 
$response = $request.GetResponse() 
If ($response.StatusCode -eq "OK") 
{ 
    #$True 
    Write-Host "Web Ping on $_ Succeeded." 
} 
Else 
{ 
    #$False 
    Write-Host "Web Ping on $_ FAILED!!!" 
}  
} 

這裏是例如服務器列表:

server1 (reports back a 404) 
server2 (reports back a 503) 
server3 (gets a status = "OK") 

這裏是 「準確」 CMD輸出,當我運行該腳本:

C:\TFS\Sandbox>powershell ./temp.ps1 

Pinging web address for server: http://server1.domain.net/wfc/logon ... 
Exception calling "GetResponse" with "0" argument(s): "The remote server return 
ed an error: (404) Not Found." 
At C:\TFS\Sandbox\temp.ps1:8 char:34 
+  $response = $request.GetResponse <<<<() 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 
Web Ping on server1 FAILED!!! 

Pinging web address for server: http://server2.domain.net/wfc/logon ... 
Exception calling "GetResponse" with "0" argument(s): "The remote server return 
ed an error: (503) Server Unavailable." 
At C:\TFS\Sandbox\temp.ps1:8 char:34 
+  $response = $request.GetResponse <<<<() 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 
Web Ping on server2 FAILED!!! 

Pinging web address for server: http://server3.domain.net/wfc/logon ... 
Web Ping on server3 Succeeded. 

現在,當我重新排列優先服務器列表的服務器列表時,如下所示:

server3 (gets a status = "OK")  
server1 (reports back a 404) 
server2 (reports back a 503) 

我得到的結果不準確,其中服務器1和服務器2越來越報告爲確定:

Pinging web address for server: http://server3.domain.net/wfc/logon ... 
Web Ping on server3 Succeeded. 

Pinging web address for server: http://server1.domain.net/wfc/logon ... 
Exception calling "GetResponse" with "0" argument(s): "The remote server return 
ed an error: (404) Not Found." 
At C:\TFS\Sandbox\temp.ps1:8 char:34 
+  $response = $request.GetResponse <<<<() 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 
Web Ping on server1 Succeeded. 

Pinging web address for server: http://server2.domain.net/wfc/logon ... 
Exception calling "GetResponse" with "0" argument(s): "The remote server return 
ed an error: (503) Server Unavailable." 
At C:\TFS\Sandbox\temp.ps1:8 char:34 
+  $response = $request.GetResponse <<<<() 
+ CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
+ FullyQualifiedErrorId : DotNetMethodException 
Web Ping on server2 Succeeded. 

爲什麼會出現不同的結果基礎上,服務器如何上市?

在此先感謝!

回答

3

這是因爲在WebRequest提高上不成功的嘗試例外,$response並沒有真正得到你在哪裏得到503404等。當你獲得成功,響應設置爲的情況下設定,以及,響應(狀態碼正常),但是如果下一個服務器產生一個404,比如說,響應仍然是OK狀態,因爲WebRequest只會引發一個異常並且不會給$ response分配任何東西。你可能想trap(或try catch)異常和處理的成敗有或在循環的每次迭代設置$response爲null:

foreach($server in $serverlist){ 
$response=$null 

... 

另外,不要使用$_爲迭代變量,它是自動變量,並不是在這裏使用它的好形式。

請注意,喲寫的東西也可能會耗盡系統資源(它會暫停一次),因此請妥善處置響應。 $response = $null可能已經足夠了,但您可能仍然必須在循環結束時正確地關閉響應。

+0

manojlds - 感謝您的反饋意見。非常有用,'$ response = $ null'完美運行! – Keith 2012-02-01 05:15:52

9

您可能需要關閉連接:

$response.Close() 

http://msdn.microsoft.com/en-us/library/system.net.webresponse.close(v=vs.90).aspx

我會寫這樣的:

foreach ($server in $ServerList) { 
    try { 
     $url = "http://${server}.domain.net/logon" 
     Write-Host "Pinging web address for server: $url ..." 
     $request = [System.Net.WebRequest]::Create($url) 
     $response = $request.GetResponse() 
     Write-Host "Web Ping on $server Succeeded." 
    } catch { 
     Write-Host ("Web Ping on $server FAILED!!! The error was '{0}'." -f $_) 
    } finally { 
     if ($response) { 
      $response.Close() 
      Remove-Variable response 
     } 
    } 
} 
+0

雖然關閉響應是好事,但它並不能解決OP給失敗問題提供成功的問題。 – manojlds 2012-02-01 05:04:08

+0

@manojlds我添加了一個'Remove-Variable',以防它在賦值時無效。 – 2012-02-01 05:08:00

+0

@AndyArismendi - 感謝您的反饋。我也試過你的解決方案,它的工作原理! – Keith 2012-02-01 05:20:48