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