所以我有一个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
}
}
我可以测试代码但是我无法非常轻松地测试错误,因为大多数文件都在那里。无论如何,我会感谢任何帮助。提前谢谢。
答案 0 :(得分:1)
我会尝试这样的事情。如果下载失败,它假定为Download-File返回的对象为null - 您必须检查它的实际行为方式。要模拟下载失败,可以将返回的对象从Download-File重新写入$ null。
{{1}}