Powershell在下载encouters 404错误时重新尝试文件下载

Powershell在下载encouters 404错误时重新尝试文件下载,powershell,download,Powershell,Download,所以我有一个powershell脚本,它使用foreach对象循环(和System.Net.WebClient)一个接一个地下载一组文件。有时我会从特定文件的源URL中得到404错误。该错误是非术语错误,因此脚本在遇到此类错误时会继续执行。问题是,文件集需要作为一个集合下载,除非所有文件都可用,否则就没有用。因此,我需要做的是让脚本暂停,并在遇到404错误时重试下载。我很难弄清楚如何最好地实现这一点。这是我下载时使用的代码。最初它只是这样做的: Get-Content $shaFile | Fo

所以我有一个powershell脚本,它使用foreach对象循环(和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循环一样,如果目的地中不存在$u,则继续尝试下载它,直到它存在为止。在上面的代码中,我调用了一个名为“下载文件”的函数和一个名为“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
}
}

我可以测试代码,但我不能很容易地测试错误,因为大多数时候文件都在那里。不管怎样,我会很感激这里的任何帮助。提前谢谢。

我想试试这样的东西。如果下载失败,它假定为下载文件返回的对象为空-您必须检查它的实际行为。要模拟失败的下载,可以将下载文件中返回的对象重新写入$null

$maxRetries = 5
$retryWaitSeconds = 60
Get-Content $shaFile | Foreach-Object { ($_ -split " ", 2)[0] } |
        Where-Object { ($adfs.$v.iniFile,$shaFile -NotContains $_) -and (Is-Match $_) } | Foreach-Object {
            do {
                $file = Download-File $w $_ $dir
                #force the file download to fail 3 times for testing
                foreach ($i in 1..3) {
                    $file = $null
                }

                #sleep if the file download failed.
                if ($file -eq $null) {
                    start-sleep $retryWaitSeconds
                }
            }
            while (($file -eq $null) -and ($retryCount -le $maxRetries)) #limit the maximum number of retries in case download will never succeed.
        }
. 无论重试多少次都无法解决此问题。