You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:25:43