2013-10-04 26 views
0

我基本上有这个简单的powershell脚本,它执行一个ssrs报告url并将其保存到网络。Powershell - 简单地检查一个函数是否成功完成(超时)

它通常运行良好,但有时它超时,当它确实,它仍然说它成功。我尝试了一些没有运气的事情。

我的脚本的简化版本是这样的:

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

我已经试过这样的东西没有运气:

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

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

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

使用“0”参数调用“GetResponse”异常:“操作已超时” 在C:\ data \ powershell \ script.ps1:9 char:49 + [Net.HttpWebResponse] $ result = $ req.GetResponse < < < <() + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

你不能调用一个空值表达式的方法。 在C:\数据\的powershell \ script.ps1:10字符:48 + [IO.Stream] $流= $ result.GetResponseStream < < < <() + CategoryInfo:InvalidOperation:(的GetResponseStream:字符串)[] ,RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull

您无法在空值表达式上调用方法。 在C:\数据\的powershell \ script.ps1:18字符:38 + $计数= $ stream.Read < < < <($缓冲液,0,$ buffer.Length) + CategoryInfo:InvalidOperation:(读: String)[],RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull

您无法在空值表达式上调用方法。 在C:\数据\的powershell \ script.ps1:23字符:14 + $ stream.Close < < < <() + CategoryInfo:InvalidOperation:(关闭:字符串)[],的RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull

任何帮助将不胜感激。我认为这应该相当简单,只是没有正确的语法?谢谢

+0

什么您使用的是PowerShell版本吗?你有没有考虑过使用Invoke-WebRequest作为PS版本3的一部分? – Colyn1337

回答

1

也许你可以使用try/catch来处理这部分是这样的:

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

谢谢,但我试图把这没有运气。它贯穿整个过程,不创建文件,但仍然输出“成功”。 – Jay

+0

该代码正在解决您提到的有关“超时”的问题。但是,您现在提到的问题将在稍后发生。你也可以使用try/catch来创建文件。 –

+0

这让我得到了一些工作。按照建议使用Try/Catch,例如捕捉返回11。后来,当我叫我这样做的功能: '$ VAR = RunReport “$网址” “$ OUTPUTFILE” 如果($变种-ne 11){成功代码} 其他{失败码}' 感谢 [链接](http://www.manning-sandbox.com/thread.jspa;jsessionid=RhxMA3gbFwd3mWwe?messageID=57987) – Jay

0

'无法调用空值表达式的方法'错误全部源于事实:.GetResponse方法失败并出现超时,未赋值$ result变量。最简单的改变是将脚本的其余部分(在“$ result = $ req.GetResponse()”之后)放入“if($ result){}”块中。然后,您可以使用“然后{}”块来执行错误处理。

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

+0

我在PowerShell中很新,并尝试下面的try/catch解决方案,但没有运气。你能提供我可以尝试的示例代码吗?非常感激!! – Jay

0

你有两个问题:

  1. (从和级联错误)的超时

  2. RunReport功能不会再回到什么。

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

对于#1,当您调用GetResponse()时,您需要将其封装在try/catch块中,捕获异常并退出该函数并返回给调用者。

你可能想看看this SO post关于使用SOAP方法调用SSRS。