如何修改PowerShell脚本,实现仅下载URL目录中修改时间超过10分钟的文件
实现思路与修改后的脚本
要实现这个需求,核心是获取远程文件的最后修改时间,并和当前时间对比判断是否在10分钟内。具体步骤和修改后的脚本如下:
关键逻辑说明
- 对每个远程文件发送
HEAD请求(仅获取响应头,比完整下载更高效),提取Last-Modified响应头字段——这个字段记录了文件在服务器上的最后修改时间。 - 将
Last-Modified字符串转换为PowerShell可识别的DateTime对象,用不变文化格式解析避免系统区域设置导致的解析错误。 - 计算当前时间与远程文件修改时间的差值,如果差值小于10分钟,则跳过下载;否则继续执行原有的本地文件存在性判断。
修改后的完整脚本
$outputdir = 'C:\mydir\public\demos' $url = 'https://xxx.xxx.net/fastdl/xxx/xxx/public/' $skipWindowMinutes = 10 # 可灵活调整的跳过时间窗口 # 启用TLS 1.2和TLS 1.1协议 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Tls11 $WebResponse = Invoke-WebRequest -Uri $url # 获取链接列表,跳过上级目录链接(../)并处理每个文件 $WebResponse.Links | Select-Object -ExpandProperty href -Skip 1 | ForEach-Object { $fileName = $_ Write-Host "Processing file '$fileName'" $filePath = Join-Path -Path $outputdir -ChildPath $fileName $fileUrl = '{0}/{1}' -f $url.TrimEnd('/'), $fileName try { # 发送HEAD请求获取远程文件的最后修改时间 $headResponse = Invoke-WebRequest -Uri $fileUrl -Method Head if ($headResponse.Headers.ContainsKey('Last-Modified')) { # 解析Last-Modified时间(使用不变文化避免区域格式问题) $lastModified = [DateTime]::Parse($headResponse.Headers['Last-Modified'], [System.Globalization.CultureInfo]::InvariantCulture) $timeSinceModified = (Get-Date) - $lastModified if ($timeSinceModified.TotalMinutes -lt $skipWindowMinutes) { Write-Host "Skipping file '$fileName' - modified within last $skipWindowMinutes minutes" -ForegroundColor Cyan return } } else { # 如果服务器未返回Last-Modified头,默认允许下载(可根据需求调整) Write-Host "No Last-Modified header found for '$fileName' - proceeding with download check" -ForegroundColor Gray } } catch { Write-Host "Failed to retrieve metadata for '$fileName': $_" -ForegroundColor Red return } # 原有本地文件存在性判断 if (Test-Path $filePath) { Write-Host 'Skipping file, already downloaded' -ForegroundColor Yellow return } # 执行下载 Write-Host "Downloading file '$fileName'" -ForegroundColor Green Invoke-WebRequest -Uri $fileUrl -OutFile $filePath }
额外说明
- 我把原脚本里的
-Skip 0改成了-Skip 1,因为公开目录的第一个链接通常是../(上级目录),不需要处理这个无效链接。 - 添加了
try-catch块处理HEAD请求可能出现的异常(比如文件不存在、服务器拒绝请求等),避免脚本直接崩溃。 - 把跳过时间窗口做成了变量
$skipWindowMinutes,方便后续随时调整时长。 - 如果服务器不返回
Last-Modified头,脚本默认继续执行下载检查——你可以根据需求修改这部分逻辑,比如改为直接跳过这类文件。
内容的提问来源于stack exchange,提问作者Emrik Ahlström
相关产品推荐
相关产品推荐

