es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Exploración de powershell para buscar archivos faltantes en carpetas múltiples.

Estoy verificando los mosaicos de mapa XYZ que faltan utilizando Powershell, pero me atasco en los bucles anidados. Esencialmente, los mosaicos de mapa existen en una carpeta “base”, dentro de esta carpeta base hay múltiples directorios. Dentro de cada directorio se encuentran los mosaicos de mapa.

Por ejemplo:

C:\Mi Mapa\17\       # esta es la carpeta Base, nivel de zoom 17
C:\Mi Mapa\17\1234\  # esta es una carpeta que contiene mosaicos de mapa
C:\Mi Mapa\17\1234\30200.png  # este es un mosaico de mapa
C:\Mi Mapa\17\1234\30201.png  # este es un mosaico de mapa
C:\Mi Mapa\17\1234\30203.png  # este es un mosaico de mapa, pero nos falta 30202.png (tenemos mosaicos a cada lado)
C:\Mi Mapa\17\1234\30204.png  # este es un mosaico de mapa
C:\Mi Mapa\17\1235\  # esta es otra carpeta que contiene mosaicos de mapa [...]

Entonces, mi idea es escanear cada carpeta en busca de brechas donde tenemos mosaicos a cada lado e intentar descargarlos.

Esto es lo que tengo hasta ahora:

$BasePath = "C:\_test\17\"

$ColumnDirectories = Get-ChildItem $BasePath -Directory

$ColumnDirectories | ForEach-Object {
    $ColumnDirectory = $ColumnDirectories.FullName 
    $MapTiles =  Get-ChildItem -Path $ColumnDirectory -Filter *.png -file
    $MapTiles | ForEach-Object {
        #Write-Host $MapTiles.FullName
        $TileName = $MapTiles.Name -replace '.png',''
        $TileNamePlus1 = [int]$TileName + 1
        $TileNamePlus2 = [int]$TileName + 2
        Write-Host $TileName
    }
}

Pero recibo “No se puede convertir el valor ‘System.Object[]’ del tipo ‘System.Object[]’ al tipo ‘System.Int32′”.

Eventualmente, quiero hacer un Test-Path en cada uno de $TileName, TileNamePlus1, $TileNamePlus2, y donde el segundo no existe, descargarlo de nuevo.

Por ejemplo:

C:\Mi Mapa\17\1234\30201.png -- Existe
C:\Mi Mapa\17\1234\30202.png -- No existe, descargar de https://somemapsrv.com/17/1234/30202.png
C:\Mi Mapa\17\1234\30203.png -- Existe

¡Cualquier ayuda es apreciada! Soy bastante nuevo en Powershell.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, el problema con el código está en el bucle ForEach-Object anidado, ya que $MapTiles es un array y se necesita hacer referencia al objeto actual del bucle utilizando $_ dentro del bucle. Debe ser:

    $MapTiles | ForEach-Object {
        $TileName = $_.Name -replace '.png',''
        $TileNamePlus1 = [int]$TileName + 1
        $TileNamePlus2 = [int]$TileName + 2
        Write-Host $TileName
    }
    

    A continuación, para verificar la falta de azulejos y descargarlos, se puede utilizar Test-Path para verificar si el archivo existe e Invoke-WebRequest para descargarlo si no existe. Aquí está el código actualizado:

    $BasePath = "C:\_test\17\"
    
    $ColumnDirectories = Get-ChildItem $BasePath -Directory
    
    $ColumnDirectories | ForEach-Object {
        $ColumnDirectory = $_.FullName 
        $MapTiles =  Get-ChildItem -Path $ColumnDirectory -Filter *.png -file
        $MapTiles | ForEach-Object {
            $TileName = $_.Name -replace '.png',''
            $TileNamePlus1 = [int]$TileName + 1
            $TileNamePlus2 = [int]$TileName + 2
            if (!(Test-Path "$ColumnDirectory\$($TileNamePlus1).png")) {
                Write-Host "Azulejo faltante: $($TileNamePlus1)"
                Invoke-WebRequest -Uri "https://somemapsrv.com/17/$($_.Directory.Name)/$($TileNamePlus1).png" -OutFile "$ColumnDirectory\$($TileNamePlus1).png"
            }
            if (!(Test-Path "$ColumnDirectory\$($TileNamePlus2).png")) {
                Write-Host "Azulejo faltante: $($TileNamePlus2)"
                Invoke-WebRequest -Uri "https://somemapsrv.com/17/$($_.Directory.Name)/$($TileNamePlus2).png" -OutFile "$ColumnDirectory\$($TileNamePlus2).png"
            }
        }
    }
    

    Esto recorrerá cada directorio y cada azulejo de mapa, verificará la falta de azulejos y los descargará si faltan. ¡Háganme saber si tienen alguna pregunta!

Comments are closed.