none
Como hacer un Loop en PS? RRS feed

  • Pregunta

  • Buenas,

    Tengo una serie de servers en computers.txt y si selecciono el primero con totalcount 1 no hay problema pero necesito que cuando finalice el guión haga un loop y empiece el script de nuevo con el siguiente servidor de computers.txt así hasta el final del txt.

    $FSGETSERVERS = Get-content -path "c:\program files\hyper-v\computers.txt" -totalcount 1

    $SRV1 = Read-Host "Enter the Virtual Machine name (Press [Enter] to choose Computers.txt)" 
    if ($SRV1 -eq ""){$SRV1=$FSGETSERVERS} ; if ($SRV1 -eq $NULL){$SRV1=$FSGETSERVERS}

    A ver si algún alma caritativa me puede ayudar....




    • Editado Nickneutrino jueves, 17 de mayo de 2012 18:19
    • Tipo cambiado Uriel Almendra jueves, 6 de junio de 2013 15:21 It's a question
    jueves, 17 de mayo de 2012 18:18

Respuestas

  • Me respondo a mi mismo por si alguien lo necesita ...... para hacer el loop es tan  facil como introducir el alias  foreach o cmdlet foreach-object  para que lea cada linea de computers. txt y al principio y finalizar el resto de programa con otros parentesis {}y te hace un loop por cada linea del txt 


    $FSGETSERVERS = Get-content -path "c:\program files\hyper-v\computers.txt"
    foreach($MACHINENAME in $FSGETSERVERS)

    {$SRV1 = Read-Host "Enter the Virtual Machine name (Press [Enter] to choose Computers.txt)" 
    if ($SRV1 -eq ""){$SRV1=$FSGETSERVERS} ; if ($SRV1 -eq $NULL){$SRV1=$FSGETSERVERS}}

    saludos......

    • Marcado como respuesta Uriel Almendra jueves, 6 de junio de 2013 15:22
    viernes, 18 de mayo de 2012 10:22

Todas las respuestas

  • Me respondo a mi mismo por si alguien lo necesita ...... para hacer el loop es tan  facil como introducir el alias  foreach o cmdlet foreach-object  para que lea cada linea de computers. txt y al principio y finalizar el resto de programa con otros parentesis {}y te hace un loop por cada linea del txt 


    $FSGETSERVERS = Get-content -path "c:\program files\hyper-v\computers.txt"
    foreach($MACHINENAME in $FSGETSERVERS)

    {$SRV1 = Read-Host "Enter the Virtual Machine name (Press [Enter] to choose Computers.txt)" 
    if ($SRV1 -eq ""){$SRV1=$FSGETSERVERS} ; if ($SRV1 -eq $NULL){$SRV1=$FSGETSERVERS}}

    saludos......

    • Marcado como respuesta Uriel Almendra jueves, 6 de junio de 2013 15:22
    viernes, 18 de mayo de 2012 10:22
  • Mira si te vale esta idea. El script carga el fichero al completo y busca la primera línea con nombre de equipo que no comience por almohadilla (#). Una vez lo encuentra se guarda el nombre y pone la almohadilla como primer caracter de la línea y sobrescribe el fichero, de manera que en las sucesivas ejecuciones del script se van descartando los nombres utilizados.

    # Obtenemos la lista de equipos
    $Servidores = Get-Content -Path "c:\program files\hyper-v\computers.txt"
    
    # Iniciamos la variable con el nombre obtenido desde el fichero
    $Servidor = ""
    
    # Recorremos las líneas del fichero
    For($i=0;$i-lt $Servidores.Count;$i++)
    {
        # No nos interesan ni las líneas en blanco, ni que tengan sólo espacios.
        # Además, tampoco queremos que empiece la línea con una almohadilla, pues
        # eso significa que el nombre de servidor ya fue extraído del archivo
        If([System.String]::IsNullOrEmpty($Servidores[$i].Trim()) -eq $false -and `
           $Servidores[$i].SubString(0,1) -ne "#")
        {
            # Guardamos el nombre del servidor
            $Servidor = $Servidores[$i]
            
            # Ponemos una almohadilla al principio de la línea de la que lo hemos
            # extraído
            $Servidores[$i] = "#$($Servidores[$i])"
            
            # Sobrescribimos el archivo para que así quede comentado el nombre
            # utilizado
            Set-Content -Path "c:\program files\hyper-v\computers.txt" -Force `
                        -Value $Servidores
            
            # Salimos del bucle
            Break
        }
    }
    
    # Montamos el mensaje que se mostrará al usuario para que entre el nombre de
    # máquina virtual
    $Mensaje = "Escriba el nombre de la máquina virtual ([Enter] para"
    $Mensaje = "$Mensaje obtenerlo desde el fichero Computers.txt)" 
    
    # Solicitamos el nombre al usuario
    $SRV1 = Read-Host $Mensaje
    
    # Si el usuario pulsó [Enter]
    If ([System.String]::IsNullOrEmpty($SRV1))
    {
    
        # Asignamos el nombre del servidor obtenido desde el fichero
        $SRV1=$Servidor
        
        # Podría ser que en el fichero no quedaran nombres sin usar, de ahí el que
        # hagamos esta comprobación
        If([System.String]::IsNullOrEmpty($SRV1))
        {
            # Montamos el mensaje que se mostrará al solicitar de nuevo que entre
            # el nombre del equipo y le advertimos que si no lo entra se cancel la
            # ejecución
            $Mensaje = "No quedan nombres de equipo sin utilizar en Computers.txt."
            $Mensaje = "$Mensaje Escriba el nombre de la máquina virtual"
            $Mensaje = "$Mensaje ([Enter] para cancelar la ejecución)" 
            
            # Solicitamos que entre el nombre del equipo
            $SRV1 = Read-Host $Mensaje
            
            # si no ha entrado el nombre cancelamos la ejecución
            If([System.String]::IsNullOrEmpty($SRV1))
            {
                Write-Host "Ejecución Cancelada"
                Break
            }
        }
    }
    
    # Mostramos el nombre elegido
    Write-Host """$SRV1"""



    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)

    viernes, 18 de mayo de 2012 10:24
    Moderador
  • No te debí entender el problema, pues mi primera intención fuen ponerte lo del ForEach, pero luego entendí que quería ejecutar el script una vez nada más y que se fueran usando los nombres sin repetir, no que quisieras ejecutar tantos inputs como líneas tiene el fichero

    Un saludo

    Fernando Reyes [MS MVP]
    MCSA 2000/2003
    MCSE 2000/2003
    MCITP EnterpriseAdministrator
    Web: http://freyes.svetlian.com
    Blog: http://urpiano.wordpress.com
    RSS: http://urpiano.wordpress.com/feed/
    freyes.champú@champú.mvps.org
    (Aclárate la cabeza si quieres escribirme)

    viernes, 18 de mayo de 2012 10:27
    Moderador