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.

¿Cómo manejar un mapeo de red con reintentos y bucles en PowerShell?

Me gustaría mapear una red. Necesito usar reintento si el mapeo falla. Después de máximo reintento, fallará y continuará con otro proceso. Si el mapeo es exitoso, también continúe con otro proceso. He intentado de esta manera, pero parece que el reintento no está funcionando. Una vez que el mapeo falla, no realiza el proceso de mapeo de red, solo procesa el bucle.
¿Alguien me puede dar alguna idea por favor?

$Stoploop = $false
[int]$Retrycount = "0"
hacer {
     intentar {
          $net = New-Object -ComObject WScript.Network                   
          $net.MapNetworkDrive("$Path", "\\$IP\$Folder", $False, "$Server\$user", "$pass")
          $Message = "Mapeo de red: " + $Path + " Montaje exitoso"
          Write-Host $Message
          $Stoploop = $true
          CaptureLog "$Message`n"
     }
     atrapar {
          if ($Retrycount -eq 15){
               $Message_1 = "No se pudo montar después de 15 reintentos." + " $_"
               $Stoploop = $true
               CaptureLog $Message_1
               ErrorHandling $Message_1
          }
          else {
               $Message = "Mapeo de red: " + $Path + " Intentando montar..."
               Write-Host $Message
               CaptureLog $Message
               Start-Sleep -Seconds 3
               $Retrycount = $Retrycount + 1
          }
     }
}
mientras ($Stoploop -eq $false)

¡Muchas gracias por el consejo. ¡Apreciado!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarse de que la lógica de reintento esté funcionando, debe agregar una condición para verificar si la bandera $Stoploop aún es falsa después del bloque try-catch. Si todavía es falsa, entonces incremente la variable $Retrycount e intente nuevamente el proceso de mapeo. Además, puede agregar un tiempo de espera entre los reintentos para evitar sobrecargar el sistema con solicitudes. Aquí está el código actualizado con estas modificaciones:

    $Stoploop = $false
    [int]$Retrycount = 0
    $maxRetries = 15
    
    do {
        try {
            $net = New-Object -ComObject WScript.Network
            $net.MapNetworkDrive("$Path", "\\$IP\$Folder", $false, "$Server\$user", "$pass")
            $Mensaje = "Mapeo de red: $Path montado exitosamente"
            Write-Host $Mensaje
            CaptureLog "$Mensaje`n"
            $Stoploop = $true
        }
        catch {
            if ($Retrycount -ge $maxRetries) {
                $Mensaje_1 = "No se pudo montar después de $maxRetries reintentos. $_"
                $Stoploop = $true
                CaptureLog $Mensaje_1
                ErrorHandling $Mensaje_1
            }
            else {
                $Mensaje = "Mapeo de red: $Path Intentando montar (reintento $Retrycount)..."
                Write-Host $Mensaje
                CaptureLog $Mensaje
                Start-Sleep -Seconds 3
                $Retrycount++
            }
        }
    
        if ($Stoploop -eq $false) {
            Start-Sleep -Seconds 5  # esperar antes de reintentar
        }
    } while ($Stoploop -eq $false)
    

    En este código actualizado, se agrega una variable nueva llamada $maxRetries para controlar cuántas veces se debe reintentar el proceso de mapeo. La condición en el bloque catch se cambia a -ge en lugar de -eq, de modo que se determinda como fallida después de alcanzar el máximo de reintentos. Dentro del bucle, se agrega un comando adicional Start-Sleep para esperar 5 segundos antes de volver a intentar el proceso de mapeo y así evitar sobrecargar el sistema.

Comments are closed.