Sqljob,如果文件不包含某些文本,则使powershell步骤失败

时间:2018-10-29 00:48:44

标签: powershell sql-job

这是为了寻求针对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>,则我希望该步骤失败,因此在该步骤失败之前会重试该步骤几次。

文件大小也可能是一个错误标准。失败的传输需要几行,成功的传输需要兆字节。

1 个答案:

答案 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{}
}