【问题标题】:Sqljob, make powershell step fail if file does not contain certain textSqljob,如果文件不包含某些文本,则使 powershell 步骤失败
【发布时间】:2018-10-29 00:48:44
【问题描述】:

这是对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>,我希望该步骤失败,因此该步骤在硬失败之前重试几次。

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

【问题讨论】:

  • 您更愿意检查它是 xml 还是以 结尾
  • 它应该是 xml,但我认为假设它以通常的 结尾会更容易,那么其余的可能就可以了。

标签: powershell sql-job


【解决方案1】:

所以基本上我为此做了一个函数。设置尝试次数和要运行的脚本。

function TryAgain($Attempts = 1, $Scriptblock){
    while($Attempts -gt 0){
        try{
            Invoke-Command -ScriptBlock $Scriptblock
            Break
        }catch{
            $_.Exception
            $Attempts -= 1
        }
    }
}

在这种情况下,我们想确定它是否是有效的 XML,因此我们将获取 Invoke-WebRequest.RawContent 并针对 $(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{}
}

【讨论】:

  • 看起来令人印象深刻。但这是否矫枉过正?它可以只读取文件,检查有效性,然后如果无效则失败并让 sql-job 处理重试、等待时间和硬失败?我可以在每一步都说它应该重试 n 次并在重试之间等待 m 秒。
  • 即只是你的第二个街区?我想抛出“Bad XML”会触发该步骤的失败退出。不管怎样,现在是凌晨 4 点,我明天试试这个 ;-)
  • 你可以只使用第二个块。我认为您需要在 webinvokes 上重试。如果此时不需要重试,我也可以将其设为单列
  • sql-job 处理程序可以管理重试,无需通过在步骤中进行重试来使其复杂化
  • 不错。几个小时后的反馈
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2020-05-07
  • 2014-08-11
相关资源
最近更新 更多