Cuando se ejecuta una instrucción While
, PS evalúa la sección $True
o $False
. Mientras la condición siga siendo $True
, PS vuelve a ejecutar la sección
La
while (<condition>){<statement list>}
El siguiente ejemplo muestra por consola los números del 1 al 3 ambos incluidos ($val
se inicializa a 0). Usamos el operador de comparación y mientras la variable no sea 3 (podiamos usar menor o igual -le
tal vez mejor) se incrementa una unidad a si misma con el operador de incremento y muestra su valor por pantalla.
While($val -ne 3)
{
$val++
Write-Host $val
}
Ejercicio: Adivinar la clave
Script que solicita al usuario que introduzca una contraseña y la compara con una contraseña interna definida en una variable, utilizamos el bucle While
y las condicionales If
.
Fuente: while-guess-pwd.ps1
Clear-Host
$ClaveScreta ="miclave"
$Acabar = "Prueba de nuevo"
while ($Acabar -ne "n")
{
$ClaveUsuario = Read-Host "Adivina la clave"
if($ClaveUsuario -eq $ClaveScreta)
{
Write-Host "Correcto! Saliendo..."
$Acabar ="n"
}
else
{
$Acabar = Read-Host "Nuevo intento? (s/n)"
}
} # Fin While
Write-Host "Fin"
Menú de usuario básico con do { ... } While
Fuente: while-basic-user-menu.ps1
Ahora vamos a implementar el clásico menú de usuario que nos será de utilidad en muchas ocasiones, el cmdlet antes de mostrar las opciones de menú comprueba si existe un fichero (Test-Path) y en caso contrario lo crea y escribe una línea de contenido (New-Item), más adelante veremos para que usamos el fichero.
if (!(Test-Path "test.txt"))
{
New-Item -name test.txt -type "file" -value "my new text"
Write-Host "Created new file and text content added"
}
A continuación comenzamos la estructura do { ... } While
y mostramos las opciones de menú:
- "d - borra fichero".
- "v - mostrar contenido de fichero".
- "q - salir / quit"
Leemos la opción introducida por el usuario y la depositamos en una variable que evaluamos en un switch
. Si la opción introducida es 'd' borramos el fichero de test creado al principio con Remove-Item. Para mostrar el contenido del fichero si el usuario introduce 'v' usamos Get-Content del fichero. Cuando selecciona 'q' simplemente mostramos un mensaje de despedida (será la condición de salida del bucle). El resto de casos cuando el usuario no introduce ninguna de las opciones previas se contemplan como default
y indicaremos al usuario que la opción introducida no es valida. Al final evaluamos la condición de salida del bucle, mientras la opción introducida no sea 'q' (operador comparación -ne
se traduciria como 'not equal') volvemos a ejecutar otra iteración volviendo a mostrar el menú de usuario.
do {
Write-Host "============== MENU =========================="
Write-Host "d - borrar fichero."
Write-Host "v - mostrar contenido de fichero"
Write-Host "q - salir / quit"
$OpcionUser = Read-Host "Selecciona opción de menú"
switch($OpcionUser)
{
'd'
{
Write-Host "Borrado fichero"
Remove-Item test.txt
}
'v'
{
Write-Host "Mostrar contenido de fichero"
Get-Content test.txt
}
'q'
{
"Saliendo"
}
default
{
Write-Host "Invalid entry"
}
} #End switch
} while($OpcionUser -ne "q") # End while
Ejercicio : Introducir comando de usuario
Fuente: while-enter-user-cmd.ps1
$command = "";
while($command -notmatch "quit")
{
$command = Read-Host "Enter your command"
}
Ejercicio : Yes / No Questión
Fuente: while-yesno-question.ps1
$validResponses = "Yes","No"
$response = ""
do
{
$response = read-host "Yes or No?"
} while($validResponses -notcontains $response)
"Got it."