В powershell, как я могу повторить загрузку через определенное время, если файл еще не существует

#powershell

#powershell

Вопрос:

У меня есть скрипт powershell, который загружает файл, подобный этому:

 powershell -Command `$progressPreference = 'silentlyContinue'; Invoke-WebRequest https://ftp.ncep.noaa.gov/data/nccf/com/cfs/prod/cfs/cfs.$m2/$m21z/6hrly_grib_04/pgbf$m2h.04.$m2h.grb2 -OutFile C:OpenGrADS-2.2datacfscfs001.grb2`  

Можно ли проверить, существует ли файл перед загрузкой, если да, то загрузите его, но если нет, то подождите определенный период времени, прежде чем повторять попытку.

Я уже пробовал это:

 function Invoke-Download {  param (  [Parameter()] [string] $uri = "https://ftp.ncep.noaa.gov/data/nccf/com/hrrr/prod/hrrr.$m2/conus/hrrr.t$m21z.wrfsfcf00.grib2.idx",  [Parameter()] [string] $outputPath = "C:OpenGrADS-2.2datahrrrtest.grb2",  [Parameter()] [int] $sleeptimer = 30,  [Parameter()] [int] $maxTries = 3,  [Parameter()] [int] $tries = 0  )   try  {  Invoke-WebRequest -Uri $uri -OutFile $outputPath;  }  catch [System.Net.WebException]  {  $tries  ;   if($tries -lt $maxTries)  {  Start-Sleep -Seconds $sleeptimer  Invoke-Download -uri $uri -outputPath $outputPath -sleeptimer $sleeptimer -maxTries $maxTries -tries $tries  }  else  {  Write-Error ("Tried to download '{0}' {1}-times and failed" -f $uri, $tries);  }  } }  

Но это тот результат, который я получил:

 C:OpenGrADS-2.201-HRRRgt;powershell.exe -noexit -executionpolicy remotesigned -file "C:OpenGrADS-2.201-HRRR01-test.ps1" Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.  Try the new cross-platform PowerShell https://aka.ms/pscore6  PS C:OpenGrADS-2.201-HRRRgt;  

Комментарии:

1. Конечно, это возможно. Однако это неподходящий вопрос для stackoverflow. Это, вероятно, лучше подходит для другого форума, такого как serverfault или суперпользователь.

Ответ №1:

Спонтанно я бы сказал, что следующая функция должна выполнять все, что вы намереваетесь сделать. При условии, что удаленная станция отправляет код состояния 404:

 function Invoke-Download {  param (  [Parameter()] [string] $uri,  [Parameter()] [string] $outputPath,  [Parameter()] [int] $sleeptimer = 30,  [Parameter()] [int] $maxTries = 3,  [Parameter()] [int] $tries = 0  )   try  {  Invoke-WebRequest -Uri $uri -OutFile $outputPath;  }  catch [System.Net.WebException]  {  $tries  ;   if($tries -lt $maxTries)  {  Start-Sleep -Seconds $sleeptimer  Invoke-Download -uri $uri -outputPath $outputPath -sleeptimer $sleeptimer -maxTries $maxTries -tries $tries  }  else  {  Write-Error ("Tried to download '{0}' {1}-times and failed" -f $uri, $tries);  }  } }  

Не стесняйтесь, дайте мне знать, если ответ вам полезен.