PowerShell: Captura errores try/catch/finally

Post relacionados:

Para controlar como responde nuestro script cuando se produce un error que finaliza la ejecución del mismo usamos los bloques try/catch/finally (si es un error que no finaliza la ejecución usamos $errorActionPreference).

En este ejemplo mostramos un mensaje de salida y continuamos con la ejecución del script:

El bloque finally se ejecuta siempre independientemente de que se produzca un error o no (por ejemplo si queremos guardar guardar una traza de ejecución en un fichero de log).

 

 

Anuncios

PowerShell: Control de errores (II)

Post relacionados:

Además de la salida de error se pueden generar otro tipo de salidas.

Salida Debug

Podemos usar el comando “Write-Debug” para mostrar este tipo de salida (o el método “WriteDebug()“).  PowerShell muestra esta salida en color amarillo normalmente.

Podemos configurar el comportamiento de “Write-Debug”  usando la variable de sistema “$DebugPreference“.

Por defecto “Write-Debug” no se muestran en consola. Usando “$DebugPreference” podemos darle los siguientes valores:

  • Continue” :  PS muestra mensaje.
  • SilentlyContinue“: No muestra mensaje.
  • Stop“: Muestra el mensaje y a continuación interrumpe ejecución.
  • Inquire“: Pregunta al usuario.

Otras salidas

 

 

 

PowerShell: Control de errores

Determinar el estado del último comando ejecutado

Si queremos conocer el estado del último comando ejecutado y su tuvo éxito o se produjo algún error.

Existen dos variables reservadas de PowerShell:

$lastExitCode

De tipo numérico representa el código de salida / error (similar a %errorlevel% en DOS).

$?

Valor booleano que indica si el último comando se ejecuto de forma satisfactoria o no.

Ejemplo de uso:

Si hacemos lo mismo pero haciendo ping a un host que no existe:

Ver los errores generados por un comando

Si ejecutamos por la línea de comandos lo siguiente:

PS > 1/0

Y a continuación:

PS > $error[0] | Format-List -Force

Sale por consola información detallada del error:

La variable reservada “$error” contiene una lista de errores. Podemos obtener el número de errores con:

PS > $error.Count

O incluso borrar la lista de errores:

PS > $error.Clear()

Como hemos visto más arriba para acceder al último error accedemos a la primera posición del array con “$error[0]”.

PS > $currentError = $error[0]

PowerShell clasifica los errores en dos tipos: Que interrumpen la ejecución del comando o del resto del script o que continuación su ejecución.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Powershell: Cambiar la contraseña de cuenta Active Directory

Partiendo de la sintaxis aprendida en el post “PowerShell: Ejemplos básicos” vamos a crear un script que permita modificar la contraseñade una cuenta basada en el nombre que introduzca el usuario por teclado, el usuario debe introducir los siguientes datos:

  • Nombre de la cuenta que
  • Nueva contraseña
  • Confirmación de la nueva contraseña
  • ¿El usuario debe cambiar la contraseña el próximo inicio de sesión? Pregunta Sí / No.

Configuración

Importa modulo con utilidades para Active Directory y establece una variable de solo lectura global (una constante) para depurar script.

Función para depuración por consola, así podemos desactivar los mensajes informativos que usamos para testear el script.

Funciones de propósito general

Función para leer una cadena introducida por el usuario

Evitamos con un pequeño control que el usuario introduzca una cadena vacía.

Función específica para preguntas donde el usuario debe seleccionar entre dos opciones:

Función de entrada principal

Nuestro script sólo tendrá una línea de código fuera de las funciones (sin contar la cabecera con la importación del modulo y la variable global) y será la llamada a la función “SetAccountPwdMain“:

Función cambio contraseña

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

 

 

 

 

 

 

C# HTTPRequestServer: Tratamiento de llamadas HTTP del cliente

En el siguiente post voy a describir un mecanismo para definir recursos que capturen cada tipo de llamada del cliente HTTP. Este diseño es muy flexible y se pueden añadir nuevas llamadas en forma de clases bien aisladas.

Ejemplos de llamada:

  • http://localhost:8080/Client?name=Iker.  Esta llamada será redirigida por el localizador de recursos al capturador adecuado para su tratamiento ClientHttpRequestHandler.
  • Lo mismo pasa para consultar la información de un producto ficticio llamando a http://localhost:8080/Product se asocia al manejador ProductHttpRequestHandler.
  • Una llamada especial InvalidHttpRequestHandler se ocupa de las llamadas de clientes a recursos que no existen http://localhost:8080/Sales.

Interface HttpRequestHandler

Una interfaz contiene solo las firmas de los métodos, más adelante veremos que cada clase que captura una llamada (por ejemplo ProductHttpRequestHandler) hereda de la interfaz pública HttpRequestHandler y define estos métodos:

  • Handle: Función capturadora de cada recurso que realiza un tratamiento especifico de la llamada del cliente.
  • GetName: Retorna una cadena con el nombre del recurso (“Product”, “Client”…) para que HttpResourceLocator pueda localizar el manejador adecuado para cada llamada.

 

Implementaciones de interface HttpRequestHandler

Las clases heredadas del interface HttpRequestHandler son las encargadas del tratamiento de cada mensaje. Cada clase tratará un tipo de mensaje, las clases implementan la definición de los dos métodos del interface:

  • GetName: Retorna el atributo de la clase con el nombre del recurso para facilitar su identificación por parte del localizador de recursos.
  • Handle: Contiene el tratamiento de la llamada, recibe como parámetro una instancia de la clase HttpListenerContext que proporciona acceso a todos los datos de la llamada (por ejemplo el nombre del cliente en la URL) y la respuesta.

ProductHttpRequestHandler

Esta clase permite obtener información de un producto pasando el nombre como parámetro en la URL.

InvalidHttpRequestHandler: Manejador para recursos no encontrados

Esta clase es algo especial, informa al cliente de que un recurso no existe con el código HTTP 404 (Not Found).

HttpResourceLocator: Localizador de recursos

La clase HttpResourceLocator registra los capturadores de cada llamada HttpRequestHandler dentro de su atributo privado _httpRequestHandlers en forma de diccionario, la clase Dictionary representa una colección de elementos clave-valor. La clave está representada con una cadena que contiene el nombre del recurso (“Product”, “Client”) para poder localizarlo, el valor es el interface HttpRequestHandler.

El constructor de la clase HttpResourceLocator instancia la clase Dictionary y registra el manejador InvalidHttpRequestHandler para retornar 404 cuando no encuentra un recurso.

El método público AddHttpRequestHandler  registra las clases de tratamiento de las llamadas basadas en el interface HttpRequestHandler pasados como entrada al método.

HttpServer: Servidor Web principal

 

 

Ejecución

Post relacionados

Enlaces externos