使用PowerShell的随机WebRequest结果

使用PowerShell的随机WebRequest结果,powershell,webrequest,Powershell,Webrequest,下面是我脚本中的一段代码,它使用WebRequest ping一个web/app服务器列表,并根据服务器列表中列出的好/坏服务器的顺序得到随机结果 例如,如果坏服务器(我得到的代码是404或503)列在列表的第一位,那么我的脚本似乎可以准确地报告。但是,如果先列出好的服务器(返回status=“OK”),则我的结果不准确 以下是我的代码片段: $ServerList = gc "$pwd\servers\test_servers.lst" ForEach ($_ in $ServerList)

下面是我脚本中的一段代码,它使用WebRequest ping一个web/app服务器列表,并根据服务器列表中列出的好/坏服务器的顺序得到随机结果

例如,如果坏服务器(我得到的代码是404或503)列在列表的第一位,那么我的脚本似乎可以准确地报告。但是,如果先列出好的服务器(返回status=“OK”),则我的结果不准确

以下是我的代码片段:

$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.
当服务器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.
ping服务器的网址:http://server3.domain.net/wfc/logon ...
服务器3上的Web Ping成功。
正在ping服务器的web地址:http://server1.domain.net/wfc/logon ...
使用“0”参数调用“GetResponse”时出现异常:“远程服务器返回”
编辑错误:(404)未找到。“
在C:\TFS\Sandbox\temp.ps1:8 char:34

+$response=$request.GetResponse这是因为
WebRequest
在尝试失败时引发异常,
$response
在您获得
503
404
等的情况下实际上没有设置。当您获得成功时,响应被设置为响应(状态代码为OK),但是,如果下一个服务器引发404,比如说,响应将仍然是OK状态,因为WebRequest只引发一个异常,并且没有为$response分配任何内容。您可能希望
捕获
(或
尝试捕获
)异常并在那里处理成功或失败,或者在循环的每次迭代中将
$response
设置为null:

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

...
另外,不要使用
$\uuu
作为迭代变量,它是自动变量,在这里使用它并不好


请注意,您所写的内容也可能会占用系统资源(对我来说它挂起了一次),因此请适当地处理响应
$response=$null可能就足够了,但在循环结束时,您可能仍然需要正确关闭响应。

您可能需要关闭连接:

$response.Close()

我会这样写:

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
        }
    }
}

虽然关闭响应很好,但这并不能解决OP的问题,即为失败的返回成功。@manojlds我添加了一个
删除变量
,以防它在赋值时未被置为空。@AndyArismendi--也感谢您的反馈。我也尝试过你的解决方案,效果很好@基思:没问题,我对它进行了一点全面的更新。这对我解决另一个问题有所帮助。非常感谢+1手册——感谢您的反馈。非常有用,
$response=$null
工作得非常好!
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
        }
    }
}