Adam The Automator (Español)

¿alguna vez ha ejecutado un script o un cmdlet de PowerShell y se ha enfrentado a un muro de texto en rojo como el que se muestra a continuación?

Ejemplo de errores en PowerShell

Errores puede llegar a ser abrumador y confuso. Y sobre todo, los errores a menudo son difíciles de leer, lo que hace que determinar qué y dónde salió mal el guion sea casi imposible.,

afortunadamente, tiene algunas opciones en PowerShell para mejorar esto mediante el manejo de errores. Usando el manejo de errores, los errores se pueden filtrar y mostrar de tal manera que sea más fácil de entender. Además, comprender el error hace que sea fácil agregar más lógica al manejo de errores.

en este artículo, aprenderá acerca de los errores en PowerShell y cómo se pueden interceptar para realizar el manejo de errores utilizando los bloques de PowerShell Try Catch (y los bloques finally).,

tabla de contenidos

comprender cómo funcionan los errores en PowerShell

antes de adentrarnos en el manejo de errores, veamos primero Algunos conceptos relacionados con los errores en PowerShell. Comprender los errores puede conducir a mejores estrategias de manejo de errores.

la Variable automática rror

en PowerShell, hay muchas variables automáticas, y una de ellas es la variable automática $Error. PowerShell utiliza la variable $Error para almacenar todos los errores encontrados en la sesión., La variable $Error es una matriz de errores ordenados por los más recientes.

la primera vez que abre una sesión de PowerShell, la variable $Error está vacía. Puede comprobarlo llamando a la variable $Error.

El Error $variable está vacía

Como puede ver, el $Error variable comienza vacía., Pero, una vez que se genera un error, el error se agregará y se almacenará en la variable $Error.

en el ejemplo siguiente, el error se genera al obtener deliberadamente un nombre de servicio que no existe.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
El error se agrega a la $variable de Error

Como se puede ver en el resultado anterior, el error generado fue añadido a $Error variable.,

la variable Error Error contiene una colección de errores generados en la sesión de PowerShell. Se puede acceder a cada error llamando a su posición de matriz. El último error siempre estará en el índice 0.

por ejemplo, el último error se puede recuperar usando $Error.

las propiedades del objeto Error Error

dado que todo en PowerShell es un objeto, la variable $Error es un objeto y los objetos tienen propiedades., Al canalizar la variable $Error al cmdlet Get-Member, debería ver la lista de las propiedades disponibles.

$Error | Get-Member
La $propiedades del objeto Error

Para determinar la causa del error, usted puede ver el contenido de la etiqueta InvocationInfo propiedad utilizando el comando a continuación.,

$Error.InvocationInfo
la propiedad InvocationInfo

ahora, usted podría hacer lo mismo con las otras propiedades y descubrir qué otra información se puede encontrar!

Errores de terminación

Los errores de terminación detienen el flujo de ejecución cuando PowerShell lo encuentra frente a errores no de terminación. Hay varias maneras en que puede ocurrir un error de terminación. Un ejemplo es cuando se llama a un cmdlet con un parámetro que no existe.,

como verá en la imagen siguiente, cuando se ejecuta el comando Get-Process notepad, el comando es válido y se muestran los detalles del proceso del Bloc de notas.

El proceso de bloc de notas detalles

Pero, cuando un parámetro que no existe es utilizado como Get-Process notepad -handle 251, el cmdlet muestra un error de que el handle parámetro no es válido. A continuación, el cmdlet se cierra sin mostrar los detalles del proceso notepad.,

Error se produce debido a que el parámetro no es válido

No termina de Errores

No termina errores son errores que no se detiene la ejecución del script o comando. Por ejemplo, echa un vistazo al siguiente código. Este código obtiene la lista de nombres de archivo de la lista de archivos.archivo txt. Luego, el script pasa por cada nombre de archivo, lee el contenido de cada archivo y lo muestra en la pantalla.

$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}

El contenido de este archivo.,los archivos txt son los nombres de archivo que se muestran en la lista a continuación.

File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log

pero qué pasa si File_6.¿el tronco no existía realmente? Cuando ejecuta el código, esperaría que ocurriera un error porque el script no puede encontrar el File_6.registro. Verá una salida similar que se muestra a continuación.

Ejemplo de no-error de terminación

Como se puede ver en la captura de pantalla del resultado anterior, el guión fue capaz de leer los primeros cinco archivos en la lista, pero cuando se trató de leer el archivo File_6.,txt, se devuelve un error. El script continuó leyendo el resto de los archivos antes de salir. No terminó.

la Variable er ErrorActionPreference

hasta ahora, ha aprendido sobre los errores terminantes y no terminantes y cómo difieren entre sí. Pero, ¿sabía que un error no terminante puede ser forzado a ser tratado como un error de terminación?

PowerShell tiene un concepto llamado variables de preferencia. Estas variables se utilizan para cambiar el comportamiento de PowerShell de muchas maneras diferentes. Una de estas variables, se llama $ErrorActionPreference.,

la variable $ErrorActionPreference se utiliza para cambiar la forma en que PowerShell trata los errores no terminantes. De forma predeterminada, el valor $ErrorActionPreference se establece en Continue. Cambiar el valor de la variable $ErrorActionPreference a STOPobliga a PowerShell a tratar todos los errores como errores de terminación.

Use el siguiente código para cambiar el valor $ErrorActionPreference.,

$ErrorActionPreference = "STOP"

para obtener más información sobre otros valores válidos de variable er ErrorActionPreference, visite PowerShell ErrorActionPreference.

ahora, consulte el ejemplo utilizado en la sección Errores Sin terminación en este artículo. El script puede modificarse para incluir el cambio en $ErrorActionPreference como el código que se muestra a continuación:

ejecutar el código modificado anterior se comportará de manera diferente que antes cuando el valor $ErrorActionPreference se establezca en el valor predeterminado de Continue.,

forzar un error de terminación usando la variable $ErrorActionPreference

como se puede ver en la captura de pantalla del resultado anterior, el script fue capaz de leer los primeros cinco archivos de la lista, pero cuando trató de leer el archivo file_6.txt, se devuelve un error porque el archivo no se encontró. Entonces, el script terminó, y el resto de los archivos no se leen.,

el valor $ErrorActionPreference solo es válido en la sesión actual de PowerShell. Se restablece al valor predeterminado una vez que se inicia una nueva sesión de PowerShell.

El parámetro común ErrorAction

Si el valor $ErrorActionPreference se aplica a la sesión de PowerShell, el parámetro ErrorAction se aplica a cualquier cmdlet que admita parámetros comunes. El parámetro ErrorAction acepta los mismos valores que la variable $ErrorActionPreference.,

el valor del parámetro ErrorActiontiene prioridad sobre el valor $ErrorActionPreference.

volvamos atrás y usemos el mismo código en el ejemplo anterior. Pero, esta vez, el parámetro ErrorAction se agrega a la línea Get-Content.

después de ejecutar el código modificado, verá que a pesar de que $ErrorActionPreference se establece en Continue, el script todavía terminó una vez que encontró un error., El script terminó porque el valor del parámetro -ErrorAction En Get-Content está establecido en STOP.

forzar un error de terminación usando el parámetro ErrorAction

usando PowerShell pruebe los bloques catch

en este punto, ha aprendido sobre los errores de PowerShell y cómo funcionan los parámetros $ErrorActionPreference y ErrorAction., Ahora, es el momento de aprender sobre las cosas buenas: los bloques de PowerShell Try Catch Finally.

PowerShell try catch los bloques (y opcional finally block) son una forma de lanzar una red alrededor de un fragmento de código y detectar cualquier error que regrese.

el siguiente código muestra la sintaxis de la instrucción Try.

try { <statement list>}catch *]{ <statement list>}finally { <statement list>}

El Try bloque contiene el código que desea PowerShell para «probar» y seguimiento de errores., Si el código en el bloque Try encuentra un error, el error se agrega a la variable $Error y luego se pasa al bloque Catch.

el bloque Catchcontiene las acciones a ejecutar cuando recibe un error del bloque Try. Puede haber varios bloques Catch en una instrucción Try.

el bloque Finally contiene el código que aparecerá al final de la instrucción Try., Este bloque se ejecuta independientemente de que no se haya contado un error.

Catching Non-Specific Errors (Catch-All)

una instrucción simple Try contiene un bloque Try y un bloque Catch. El bloque Finally es opcional.

por ejemplo, para capturar una excepción no específica, el parámetro Catch debe estar vacío. El siguiente código de ejemplo utiliza el mismo script que se usó en la sección Variable er ErrorActionPreference pero modificado para usar los bloques Try Catch.,

como puede ver en el código a continuación, esta vez, la instrucción foreach se incluye dentro del bloque Try. Luego, un bloque Catch contiene el código para mostrar la cadena An Error Occurred si ocurrió un error. El código en el bloque Finally simplemente borra la variable $Error.

el código anterior, después de ejecutarse en PowerShell, le dará esta salida que se muestra a continuación.,

el Script terminó cuando se produjo un error

la salida anterior muestra que el script encontró un error, ejecutó el código dentro del Catch bloque, y luego terminado.

se manejó el error, que fue el punto de manejo del error. Sin embargo, el error mostrado era demasiado genérico. Para mostrar un error más descriptivo, puede acceder a la propiedad Exception del error que pasó el bloque Try.,

el siguiente código se modifica, específicamente el código dentro del bloque Catch, para mostrar el mensaje de excepción del error actual que se pasó por la canalización – $PSItem.Exception.Message

Esta vez, cuando se ejecuta el código modificado anterior, el mensaje que se muestra es mucho más descriptivo.,

Script termina con un mensaje de error descriptivo

la Captura de los Errores Específicos

Hay veces cuando un catch-all manejo de errores no es el enfoque más apropiado. Tal vez desee que su script realice una acción que dependa del tipo de error que se encuentre.

¿Cómo se determina el tipo de error? Comprobando el valor TypeName de la propiedad Exception del último error., Por ejemplo, para encontrar el tipo de error del ejemplo anterior, use este comando:

$Error.Exception | Get-Member

El resultado del código anterior se vería como la captura de pantalla siguiente. Como puede ver, se muestra el valor TypeNameSystem.Management.Automation.ItemNotFoundException.

el error TypeName valor

Ahora que usted sabe el tipo de error que usted necesita para interceptar, modificar el código para detectar específicamente., Como puede ver en el código modificado a continuación, Ahora hay dos bloques Catch. El primer Catch bloque intercepta un tipo específico de error (System.Management.Automation.ItemNotFoundException). Por el contrario, el segundo bloque Catch contiene el mensaje de error genérico.

la captura de pantalla siguiente muestra la salida del código modificado anterior.,

el Script terminó con un mensaje de error específico

conclusión

en este artículo, ha aprendido sobre los errores en PowerShell, sus propiedades, y cómo se puede determinar el tipo específico de un error. También ha aprendido la diferencia entre la variable $ErrorActionPreference y el parámetro ErrorAction que afecta la forma en que PowerShell trata los errores no terminantes.,

también ha aprendido a usar los bloques de PowerShell Try Catch Finally para realizar el manejo de errores, ya sea para errores específicos o un enfoque general.

los ejemplos que se muestran en este artículo solo muestran los conceptos básicos de cómo funcionan los bloques Try Catch Finally. El conocimiento que espero que haya obtenido en este artículo debería darle los bloques de inicio para comenzar a aplicar el manejo de errores en sus scripts.,

Leer Más

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • Volver a lo Básico: El PowerShell Bucle foreach
  • Volver a lo Básico: la Comprensión de Objetos PowerShell

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *