这是为了寻求针对sqljob, on failed step, retry previous step, but not indefinitely
的可能解决方案的特定答案。我有一份工作,该工作使用
powershell -command "Invoke-WebRequest https://someserver.dom/fetch.php -OutFile c:/tmp/data.xml"
有时来自上游的数据不是正确的XML。我只想对文件的最后一行进行“ grep”操作,如果这不是预期的</records>
,则我希望该步骤失败,因此在该步骤失败之前会重试该步骤几次。
文件大小也可能是一个错误标准。失败的传输需要几行,成功的传输需要兆字节。
答案 0 :(得分:1)
所以基本上我为此做了一个功能。设置尝试次数和要运行的脚本。
function TryAgain($Attempts = 1, $Scriptblock){
while($Attempts -gt 0){
try{
Invoke-Command -ScriptBlock $Scriptblock
Break
}catch{
$_.Exception
$Attempts -= 1
}
}
}
在这种情况下,我们想确定它是否为有效的XML,因此我们将获取.RawContent
中的Invoke-WebRequest
并针对$(new-object System.Xml.XmlDocument).LoadXml()
进行测试。如果失败,则抛出错误;如果失败,则将原始内容输出到文件中。错误将不会保存到仅有效XML的文件中
$Site = "https://someserver.dom/fetch.php"
$OutFile = "c:/test/data.xml"
(Invoke-WebRequest $Site).RawContent | %{
try{
$(new-object System.Xml.XmlDocument).LoadXml($_)
$_ | out-file $OutFile
}catch{
throw "Bad XML"
}
}
现在我们合并为最终产品
$Site = "https://someserver.dom/fetch.php"
$OutFile = "c:/test/data.xml"
function TryAgain($Attempts = 1, $Scriptblock){
while($Attempts -gt 0){
try{
Invoke-Command -ScriptBlock $Scriptblock
Break
}catch{
$_.Exception
$Attempts -= 1
}
}
}
TryAgain -Attempts 3 -Scriptblock {
(Invoke-WebRequest $Site).RawContent | %{
try{
$(new-object System.Xml.XmlDocument).LoadXml($_)
$_ | out-file $OutFile
}catch{
throw "Bad XML"
}
}
}
因为您不需要重试,这里的所有魅力都在于基本
(Invoke-WebRequest https://someserver.dom/fetch.php).RawContent | %{
try{
(new-object System.Xml.XmlDocument).LoadXml($_)
$_ | out-file C:\test\test.xml
}catch{}
}