Powershell重新下载文件,如果它下载了冒险者404错误

时间:2017-11-15 22:31:35

标签: powershell download

所以我有一个powershell脚本,它使用foreach-object循环(和System.Net.WebClient)一个接一个地下载一组文件。我不时从特定文件的源URL获得404错误。该错误是非终止的,因此脚本在遇到此类错误时会继续运行。问题是文件集需要作为一个集合下载,除非所有文件都可用,否则它们都不好。所以我需要做的是让脚本暂停并在遇到404错误时重试下载。我无法弄清楚如何最好地实现这一目标。这是我用于下载的代码。最初只是这样做了:

Get-Content $shaFile | Foreach-Object { ($_ -split " ", 2)[0] } |
        Where-Object { ($adfs.$v.iniFile,$shaFile -NotContains $_) -and (Is-Match $_) } | Foreach-Object {
            #$null=Download-File $w $_ $dir

所以这会正确下载文件....除非我得到某种类型的错误,如404.我想要做的是让它选择错误,然后尝试下载丢失的文件,并继续尝试直到下载。通常情况下,这似乎是由于时间问题造成的,我试图下载源URL仍在发布的文件(复制并且尚不可用)。因此,如果我能够检测到错误并继续尝试下载文件直到下载,因为源URL最终会发布它。我想出的是:

Get-Content $shaFile | Foreach-Object { ($_ -split " ", 2)[0] } |
        Where-Object { ($adfs.$v.iniFile,$shaFile -NotContains $_) -and (Is-Match $_) } | Foreach-Object {

        try {
            $null=Download-File $w $_ $dir
        }

        catch {
            sleep 60
            $null=Download-File $w $_ $dir
            "Re-downloading missed file"
    }
    }

所以我认为如果遇到错误,脚本会在一分钟后重试。多数民众赞成我猜,但我想实际上尝试检查文件实际下载的时间,然后再继续。所以就像某种类型的while循环一样,如果目标中不存在$ _,请继续尝试下载它直到它。在上面的代码中,我调用了一个名为" Download-file"的函数。和一个功能" Is-Match"。下载文件使用System.Net.WebClient从网站下载文件。

我认为以下可能会有效,但我不确定它是解决这个问题的最佳方法:

Get-Content $shaFile | Foreach-Object { ($_ -split " ", 2)[0] } |
            Where-Object { ($adfs.$v.iniFile,$shaFile -NotContains $_) -and (Is-Match $_) } | Foreach-Object {
do{
    $Failed = $false
    Try{
        $null=Download-File $w $_ $dir
    } 
    catch { $Failed = $true }
} while ($Failed)

或许我可以做以下

Get-Content $shaFile | Foreach-Object { ($_ -split " ", 2)[0] } |
                Where-Object { ($adfs.$v.iniFile,$shaFile -NotContains $_) -and (Is-Match $_) } | Foreach-Object {
Try{
        $null=Download-File $w $_ $dir
}
   catch {   
    while ($error){
    Start-Sleep -s 60
    $null=Download-File $w $_ $dir
}
}

我可以测试代码但是我无法非常轻松地测试错误,因为大多数文件都在那里。无论如何,我会感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我会尝试这样的事情。如果下载失败,它假定为Download-File返回的对象为null - 您必须检查它的实际行为方式。要模拟下载失败,可以将返回的对象从Download-File重新写入$ null。

{{1}}