PowerShell: Ejemplos básicos

Lógica condicional (IF)

Si la condición condition se evalua como $true PS ejecuta el bloque de sentencias encerradas entre la apertura y cierre de llaves { … }. Lógicamente si se cumple una condición no se evalúa el resto y no se ejecuta.

if(condition)
{
    # statement block
}
elseif(condition)
{
    # statement block
}
else
{
    # statement block
}

En este caso recibimos como argumento al script una variable y mediante un operador de comparación, -eq compara si son iguales la variable $number y el número 5, proviene de equal en ingles.

Un ejemplo un poco más avanzado donde leemos dos variables introducidas por teclado durante la ejecución del script, en este caso usamos el operador de comparación –ne (se cumple la condición cuando las variables comparadas no son iguales, “not equals“).

Bucles repetitivos

Los bucles permiten ejecutar un bloque de código múltiples veces.

do … while Statement/do … until Statement

En un bucle do…While el código del interior como mínimo se ejecuta una vez antes de evaluar la condición while(condition) al final.

En el siguiente ejemplo se repite la misma sentencia mientras el usuario no introduzca una opción valida , como mínimo se mostrara una vez la pregunta al usuario:

Funciones

Las funciones permiten agrupar bloques de código con un propósito y ejecutarlo desde cualquier parte de nuestro programa invocándola por su nombre.  El script anterior podemos meterlo en una función y así no reescribir todo el código cada vez que el usuario deba seleccionar una opción.

Ayuda de la función basada en comentarios

Es una buena práctica ofrecer ayuda y documentación sobre el código para facilitar la reutilización del mismo. Por fortuna PowerShell contempla esta necesidad mediante la funcionalidad “comment_based_help“. Siguiendo una sintaxis concreta vamos a documentar la función anterior

Este es un ejemplo de una función que recibe una cadena de texto y crea una carpeta con este nombre. El comando Get-Help interpreta los comentarios del código fuente y los muestra formateados por la salida.

Enlaces:

Funciones con parámetros

Como los scripts las funciones pueden aceptar parámetros, en el ejemplo anterior lo ideal hubiese sido pasar como parámetro la ruta del directorio a crear, si siempre crease el mismo directorio no resultaría de gran utilidad, con las variables como parámetros de entrada la función condicionamos su comportamiento.

La función acepta una variable de tipo cadena de texto (string), definimos un valor por defecto, cuando se invoca la función sin parámetros crea siempre una carpeta con nombre “testDirDefault” como en la tercera llamada.

Funciones con retorno

Otro ejemplo muy típico es una función que convierte de grados Farenheit a grados Celsius.

El retorno de la función (como la variable $celsius en este caso) es cualquier cosa que escribamos. Podemos usar la palabra clave return $celsius pero no es necesario.

Comentarios de múltiples líneas

Usando “here-string” podemos crear comentarios de varias líneas sin preocuparnos de caracteres especiales como caracteres de escape o de formato de línea, la ventaja es que podemos usarlo internamente también para imprimir la ayuda de un script.

 

Usar parámetros obligatorios

Enlaces:

 

Variables globales de sólo lectura

 

 

 

 

 

 

Anuncios

PowerShell: Menú de usuario (||)

Vamos a mejorar un poco el menú del ejercicio anterior (PowerShell: Menú de usuario). Las opciones del menú principal nos dirigen a su vez a nuevos submenús de la opción seleccionada.  También hemos creado una función ‘areyousure‘ genérica para la típica opción de Sí/No que podemos usar más adelante. También hemos usado la opción ‘-ForegroundColor color‘  y ‘-backgroundcolor color‘ con Write-Host para embellecer el texto.

Enlaces interesantes sobre menús de usuario con PowerShell:

#********************* areyousure *******************************

function areyousure {
$areyousure = read-host "Are you sure you want to exit? (y/n)"

if ($areyousure -eq "y"){
exit
}

if ($areyousure -eq "n"){
show_ppal_menu
} else {
write-host -foregroundcolor red "Invalid Selection"
areyousure
}
} #end areyousure

#********************* show_ppal_menu *******************************

function show_ppal_menu {
param (
[string]$Title = 'Menu administración Active Directory'
)
cls
Write-Host "================ $Title ================"

Write-Host "1: Cuentas."
Write-Host "2: Reportes."
Write-Host "Q: Press 'Q' to quit."
}

#********************** show_accounts_menu ******************************

function show_accounts_menu {
param (
[string]$Title = 'Menu cuentas'
)
cls
Write-Host "================ $Title ================"

Write-Host "1: Bloquear cuentas por nombre."
Write-Host "2: Establecer contrasena de cuenta por nombre."
Write-Host "v: Press 'v' to return."
}

#****************************************************

do {
show_ppal_menu
$input = Read-Host "Selecciona una opcion"
switch ($input) {
'1' {
cls
Write-Host 'Has seleccionado la opcion de cuentas #1' -ForegroundColor Green
sleep -seconds 2
do {
show_accounts_menu
$input = Read-Host "Selecciona una opcion"
switch ($input) {
'1' {
cls
Write-Host 'Has seleccionado la opcion de bloquear cuenta por nombre' -ForegroundColor Green
sleep -seconds 2
} 'v' {
Write-Host "returning" -ForegroundColor Green
}

default {
Write-Host "I don't understand what you want to do with accounts." -ForegroundColor red -backgroundcolor Yellow
sleep -seconds 2
}
}
} until ($input -eq 'v') #end do/until
} '2' {
cls
Write-Host 'Has seleccionado la opcion #2' -ForegroundColor Green
sleep -seconds 2
} 'q' {
areyousure
$input = ''
}

default {
Write-Host "I don't understand what you want to do." -ForegroundColor red -backgroundcolor Yellow
sleep -seconds 2
}
} #end switch
} #end do/until
until ($input -eq 'q')

#****************************************************

 

 

 

 

PowerShell: Menú de usuario

Parece que PowerShell esta llamado a ser el reemplazo al clásico interfaz de comando DOS de toda la vida. Puede ser de especial utilidad para administrar AD (Active Directory) y realizar tareas rutinarias como bloquear usuarios, cambiar la clave de una cuenta o crear reportes para conocer la “salud” de nuestra red corporativa .

Lo primero y más evidente que necesito es un menú de administrador para abordar la tarea de titan de hacer un super script que abarque todo:

  • Cuentas
    • Bloquear cuenta
    • Establecer nueva clave de cuenta
  • Reportes
    • Cuentas que no se ha logeado hace mas de X meses por ejemplo.
  • Grupos de seguridad
  • ….

Creamos una función sencilla ‘show_ppal_menu‘  para mostrar el menú con las opciones de usuario. Usamos el comando ‘cls‘ para limpiar la pantalla y escribir las opciones de usuario.


function show_ppal_menu
{
param (
[string]$Title = 'Menú administración AD'
)
cls
Write-Host "================ $Title ================"

Write-Host "1: Cuentas."
Write-Host "2: Reportes."
Write-Host "Q: Press 'Q' to quit."
}

Las funciones en PowerShell tienen la siguiente sintaxis:

function <name> \{ <script block> \}

A continuación de la declaración de la función con su nombre entre llaves { y } definimos los comandos que queremos ejecutar cuando llamemos a la función desde otro punto de nuestro script.

Ahora que ya tenemos la función que muestra el menú de opciones necesitamos invocarla para mostrar al usuario, cuando el usuario selecciona una opción por su número ejecutaremos el código asociado a la opción y volvemos a mostrar el menú.

Usamos un bucle do/while para mostrar el menú y ejecutar la opción de forma continua hasta que el usuario pulse la tecla ‘q’ para salir del bucle.

Usamos una sentencia switch para tomar la decisión del código que queremos ejecutar según la opción seleccionada.


do
{
show_ppal_menu
$input = Read-Host "Selecciona una opción"
switch ($input)
{
'1' {
cls
'Has seleccionado la opción #1'
} '2' {
cls
'Has seleccionado la opción #2'
} 'q' {
return
}
}
pause
}
until ($input -eq 'q')

Guardamos el código en un fichero ‘menu_user_opts.ps1‘ y ya estamos listos para probarlo.