¿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?
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
.
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
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
Para determinar la causa del error, usted puede ver el contenido de la etiqueta InvocationInfo
propiedad utilizando el comando a continuación.,
$Error.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.
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
.,
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.
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 STOP
obliga 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
.,
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 ErrorAction
tiene 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
.
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 Catch
contiene 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.,
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.,
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 TypeName
– System.Management.Automation.ItemNotFoundException
.
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.,
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