使用PowerShell扫描多文件夹查找缺失XYZ地图瓦片报错求解
报错原因
你代码的核心问题是在ForEach-Object迭代块中误用了集合变量:
- 遍历列目录时,你用了
$ColumnDirectories.FullName,这是取整个列目录数组的FullName属性,返回的是数组而非当前迭代的单个目录路径 - 遍历瓦片文件时,你用了
$MapTiles.Name,这是取整个瓦片文件数组的Name属性,返回的是字符串数组,转为int时自然抛出类型转换错误ForEach-Object迭代块中需要用$_代表当前正在处理的单个对象。
完整可运行代码
$BasePath = "C:\_test\17\" $MapServerBaseUrl = "https://somemapsrv.com/17" $ZoomLevel = "17" # 和基础文件夹对应,可自行修改 # 遍历所有列号目录 Get-ChildItem $BasePath -Directory | ForEach-Object { $ColumnNum = $_.Name $ColumnDir = $_.FullName # 获取当前列下所有png瓦片,转成整数行号存入数组 $existingRowNums = Get-ChildItem -Path $ColumnDir -Filter *.png -File | ForEach-Object { [int]($_.Name -replace '\.png$', '') } | Sort-Object # 行号排序,避免顺序错乱导致检测失败 # 遍历所有现有行号,检测间隔 for ($i = 0; $i -lt $existingRowNums.Count - 1; $i++) { $currentRow = $existingRowNums[$i] $nextRow = $existingRowNums[$i + 1] # 两个相邻行号差大于1时,中间的都是缺失瓦片 if ($nextRow - $currentRow -gt 1) { # 遍历中间所有缺失的行号 for ($missingRow = $currentRow + 1; $missingRow -lt $nextRow; $missingRow++) { $localSavePath = Join-Path $ColumnDir "$missingRow.png" $downloadUrl = "$MapServerBaseUrl/$ColumnNum/$missingRow.png" Write-Host "发现缺失瓦片:$localSavePath,正在从$downloadUrl下载" # 执行下载 try { Invoke-WebRequest -Uri $downloadUrl -OutFile $localSavePath -ErrorAction Stop Write-Host "下载成功:$localSavePath" } catch { Write-Host "下载失败:$localSavePath,错误信息:$_" } } } } }
代码说明
- 自动对每个列目录下的瓦片行号排序,不会因为文件顺序错乱导致检测失效
- 支持连续多个瓦片缺失的场景,比如30201.png和30205.png都存在时,会自动下载30202、30203、30204三个缺失瓦片
- 增加了异常捕获,单个瓦片下载失败不会中断整个脚本运行
- 可以自行修改
$BasePath、$MapServerBaseUrl、$ZoomLevel参数适配不同的缩放级别、存储路径和地图服务地址
内容的提问来源于stack exchange,提问作者Bobby Tables
相关产品推荐
相关产品推荐

