Powershell-只需检查功能是否成功完成(超时)

Powershell-只需检查功能是否成功完成(超时),powershell,reporting-services,Powershell,Reporting Services,我基本上有这个简单的powershell脚本,它执行ssrs报告url并将其保存到网络 它通常运行良好,但有时它会超时,当它超时时,它仍然说它成功了。我试过几件事,但都不走运 我的脚本的简化版本如下所示: ----------------------------- function RunReport($url,$outputfile) { # // create a request [Net.HttpWebRequest] $req = [Net.WebRequest]::create($ur

我基本上有这个简单的powershell脚本,它执行ssrs报告url并将其保存到网络

它通常运行良好,但有时它会超时,当它超时时,它仍然说它成功了。我试过几件事,但都不走运

我的脚本的简化版本如下所示:

-----------------------------
function RunReport($url,$outputfile) {
# // create a request
[Net.HttpWebRequest] $req = [Net.WebRequest]::create($url)
$req.Method = "GET"
$req.Timeout = 600000 # = 10 minutes

# // Set credentials
$req.UseDefaultCredentials = $true

#echo  "Getting Response"
[Net.HttpWebResponse] $result = $req.GetResponse()
[IO.Stream] $stream = $result.GetResponseStream()

#[IO.StreamReader] $reader = New-Object IO.StreamReader($stream)
[System.IO.FileStream]$writeStream = New-Object System.IO.FileStream($outputfile, [System.IO.FileMode]::Create);

# // write to file
[byte[]]$buffer = new-object byte[] 4096
[int]$total = [int]$count = 0
do
{
 $count = $stream.Read($buffer, 0, $buffer.Length)
 $writeStream.Write($buffer, 0, $count)
} while ($count -gt 0)
$writeStream.Close()
#$stream.flush()
$stream.Close()
}


$url=...
$outputfile=...

IF(RunReport "$url" "$outputfile")
{Write-Host "Success"}
ELSE
{Write-Host "Failed"}
-------------------------------
try {
 [Net.HttpWebResponse] $result = $req.GetResponse() 
}

catch {
 return 1
}
我试过这样的东西,但运气不好:

RunReport "$url" "$outputfile"
If($?)
    {Write-Host "Success"}
ELSE
    {Write-Host "Failed"}

我正在处理的超时错误是:

使用“0”参数调用“GetResponse”时出现异常:“操作已超时” 在C:\data\powershell\script.ps1:9 char:49
+[Net.HttpWebResponse]$result=$req.GetResponse出现“无法对空值表达式调用方法”错误的原因都是.GetResponse方法因超时而失败,导致$result变量未赋值。最简单的更改是将脚本的其余部分(在“$result=$req.GetResponse()之后)放入“if($result){}”块中。然后可以使用“then{}”块来进行错误处理

更高级的方法是使用try{}和catch{}块来捕获实际的超时异常并正确处理它。

您有两个问题:

  • 超时(以及由此产生的级联错误)

  • 您的
    RunReport
    函数永远不会返回任何内容

  • 对于#2,你不能测试不存在的东西。因此,让函数向调用者返回某种成功/失败指示器

    对于#1,当调用
    GetResponse()
    时,需要将其包装在try/catch块中,捕获异常,然后退出函数,并将相应的状态返回给调用方


    您可能还需要了解如何使用SOAP方法调用SSR。

    您可以使用try/catch来处理以下部分:

    -----------------------------
    function RunReport($url,$outputfile) {
    # // create a request
    [Net.HttpWebRequest] $req = [Net.WebRequest]::create($url)
    $req.Method = "GET"
    $req.Timeout = 600000 # = 10 minutes
    
    # // Set credentials
    $req.UseDefaultCredentials = $true
    
    #echo  "Getting Response"
    [Net.HttpWebResponse] $result = $req.GetResponse()
    [IO.Stream] $stream = $result.GetResponseStream()
    
    #[IO.StreamReader] $reader = New-Object IO.StreamReader($stream)
    [System.IO.FileStream]$writeStream = New-Object System.IO.FileStream($outputfile, [System.IO.FileMode]::Create);
    
    # // write to file
    [byte[]]$buffer = new-object byte[] 4096
    [int]$total = [int]$count = 0
    do
    {
     $count = $stream.Read($buffer, 0, $buffer.Length)
     $writeStream.Write($buffer, 0, $count)
    } while ($count -gt 0)
    $writeStream.Close()
    #$stream.flush()
    $stream.Close()
    }
    
    
    $url=...
    $outputfile=...
    
    IF(RunReport "$url" "$outputfile")
    {Write-Host "Success"}
    ELSE
    {Write-Host "Failed"}
    -------------------------------
    
    try {
     [Net.HttpWebResponse] $result = $req.GetResponse() 
    }
    
    catch {
     return 1
    }
    
    您可以在其他地方应用相同的技术,如果您怀疑代码没有执行它应该执行的操作:

    try { 
    [System.IO.FileStream]$writeStream = New-Object System.IO.FileStream($outputfile, [System.IO.FileMode]::Create);
    }
    
    catch {
     return 1
    }
    
    一旦检测到问题发生的位置,就可以像

    catch { write-warning $_ ; exit 1 }
    

    您正在使用哪个版本的powershell?您是否考虑过将Invoke WebRequest作为PS版本3的一部分使用?谢谢,但我尝试过将其作为PS版本3的一部分,但没有成功。它运行了整个过程,没有创建文件,但仍然给出了“success”输出。这段代码解决了您提到的“timeout”问题。但是,您现在提到的问题将在稍后发生。你也可以在创建文件时使用try/catch。这让我找到了一些我要做的事情。通过使用建议的Try/Catch,以及返回11的on-Catch。然后,当我调用函数时,我做了以下操作:
    $var=RunReport“$url”“$outputfile”If($var-ne 11){Success code}Else{fail code}
    谢谢,我对powershell非常陌生,尝试了下面的try/catch解决方案,但运气不佳。你能提供我可以试试的示例代码吗?非常感谢!!