如何通过PowerShell仅下载比本地文件更新的URL文件
实现PowerShell仅下载更新的远程文件
这个需求其实很常见,咱们可以通过检查远程文件的Last-Modified响应头,再和本地文件的最后修改时间对比来实现——效果就和XCOPY /D一样,只下载比本地文件更新的版本。下面给你两种实用的实现方案:
方案一:用Invoke-WebRequest先检查头信息再下载
这种方法先发送一个HEAD请求只获取远程文件的响应头(不用下载整个文件,省带宽),对比时间后再决定是否下载:
# 配置参数 $remoteUrl = "http://www.domain.co.uk/downloads/File.zip" $localFilePath = "C:\Temp\File.zip" try { # 获取远程文件的最后修改时间 $headResponse = Invoke-WebRequest -Uri $remoteUrl -Method Head -ErrorAction Stop $remoteLastModified = $headResponse.Headers['Last-Modified'] | Get-Date } catch { Write-Error "获取远程文件头信息失败: $_" exit 1 } # 对比本地文件状态 if (Test-Path $localFilePath) { $localLastModified = (Get-Item $localFilePath).LastWriteTime # 统一转成UTC时间对比,避免时区差异导致判断错误 if ($remoteLastModified.ToUniversalTime() -gt $localLastModified.ToUniversalTime()) { Write-Host "远程文件已更新,开始下载..." Invoke-WebRequest -Uri $remoteUrl -OutFile $localFilePath } else { Write-Host "本地文件已是最新版本,无需下载" } } else { Write-Host "本地文件不存在,开始下载..." Invoke-WebRequest -Uri $remoteUrl -OutFile $localFilePath }
方案二:使用.NET WebClient类实现
如果你习惯用.NET类的方式,WebClient也能实现同样的逻辑,代码结构稍微不同:
# 配置参数 $remoteUrl = "http://www.domain.co.uk/downloads/File.zip" $localFilePath = "C:\Temp\File.zip" $webClient = New-Object System.Net.WebClient try { # 打开连接获取响应头(不下载文件内容) $webClient.OpenRead($remoteUrl) | Out-Null $remoteLastModified = $webClient.ResponseHeaders['Last-Modified'] | Get-Date if (Test-Path $localFilePath) { $localLastModified = (Get-Item $localFilePath).LastWriteTime if ($remoteLastModified.ToUniversalTime() -gt $localLastModified.ToUniversalTime()) { Write-Host "远程文件更新,正在下载..." $webClient.DownloadFile($remoteUrl, $localFilePath) } else { Write-Host "本地文件无需更新" } } else { Write-Host "本地无目标文件,开始下载..." $webClient.DownloadFile($remoteUrl, $localFilePath) } } finally { # 记得释放资源 $webClient.Dispose() }
额外注意事项
- 部分服务器可能不支持
HEAD请求,这时候可以把方案一中的-Method Head改成-Method Get,但加上-Headers @{"Range"="bytes=0-0"}来只请求文件的第一个字节,同样能获取响应头且不会下载大文件。 - 如果服务器没有返回
Last-Modified头,你可以考虑对比文件大小,或者使用ETag(如果服务器支持的话):把远程返回的ETag值存在本地一个配置文件里,下次请求时对比ETag是否变化,变化则下载。
内容的提问来源于stack exchange,提问作者Adam Lacey
相关产品推荐
相关产品推荐

