{"id":897025,"date":"2026-10-14T12:00:37","date_gmt":"2026-10-14T12:00:37","guid":{"rendered":"https:\/\/www.ninjaone.com\/blog\/gestion-de-errores-en-powershell\/"},"modified":"2026-10-14T12:00:38","modified_gmt":"2026-10-14T12:00:38","slug":"gestion-de-errores-en-powershell","status":"publish","type":"post","link":"https:\/\/www.ninjaone.com\/es\/blog\/gestion-de-errores-en-powershell\/","title":{"rendered":"Gu\u00eda completa de gesti\u00f3n de errores en PowerShell"},"content":{"rendered":"<p>PowerShell es la l\u00ednea de comandos y el lenguaje de scripting principal de los sistemas operativos Windows. Permite ejecutar programas y realizar tareas de gesti\u00f3n del sistema desde el terminal, y lo usan ampliamente los administradores de sistemas y los desarrolladores para automatizar sus flujos de trabajo.<\/p>\n<p>La gesti\u00f3n de errores es una parte fundamental de cualquier <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/automatizacion-con-powershell\/\">script y automatizaci\u00f3n<\/a>. Si algo va mal, tus scripts de PowerShell no deber\u00edan simplemente fallar: deber\u00edan detectar que se ha producido un error y actuar en consecuencia, ya sea reintentando la tarea o avis\u00e1ndote de que algo no ha funcionado para que puedas encontrar la causa y corregirla.<\/p>\n<p>Esta gu\u00eda te ofrece una visi\u00f3n detallada de la <strong>gesti\u00f3n de errores en PowerShell<\/strong>: tipos de errores, t\u00e9cnicas de gesti\u00f3n, ejemplos de c\u00f3mo implementarla en tus scripts y buenas pr\u00e1cticas para lanzar, capturar, registrar y responder a los errores.<\/p>\n<p>Si quieres un resumen r\u00e1pido, mira esta gu\u00eda en v\u00eddeo: <a href=\"https:\/\/www.ninjaone.com\/videos\/powershell\/complete-powershell-error-handling-guide\/\">Gu\u00eda completa de gesti\u00f3n de errores en PowerShell<\/a>.<\/p>\n<div style=\"padding: 56.25% 0 0 0; position: relative;\"><iframe data-mce-fragment=\"1\" frameborder=\"0\" height=\"350\" src=\"\/\/player.vimeo.com\/video\/1084269502?title=0&amp;byline=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" title=\"Gu\u00eda completa de gesti\u00f3n de errores en PowerShell\" width=\"425\"><\/iframe><\/div>\n<p><script src=\"https:\/\/player.vimeo.com\/api\/player.js\"><\/script><\/p>\n\n<h2>Tipos de errores en PowerShell<\/h2>\n<p>Existen dos tipos de errores que debes tratar de forma distinta para que tus scripts de PowerShell sean fiables.<\/p>\n<p>Los <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/terminating-errors?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">errores de terminaci\u00f3n<\/a> detienen la ejecuci\u00f3n del comando o del script en cuanto se producen. Normalmente se trata de <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/learn\/deep-dives\/everything-about-exceptions?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">excepciones<\/a> y pueden gestionarse con bloques try\/catch (lo explicamos m\u00e1s adelante en este art\u00edculo). Entre sus causas est\u00e1n los errores de sintaxis (cuando escribes mal un comando o pasas par\u00e1metros no v\u00e1lidos) y los errores internos de la aplicaci\u00f3n o del comando que est\u00e1s ejecutando.<\/p>\n<p>Los <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/non-terminating-errors?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">errores sin terminaci\u00f3n<\/a> no detienen la ejecuci\u00f3n del comando ni del script: tu script de PowerShell sigue funcionando despu\u00e9s de que se produzcan. Por lo general, muestran un mensaje de error y la ejecuci\u00f3n contin\u00faa, as\u00ed que hay que tratarlos de otra manera que los errores de terminaci\u00f3n para que no provoquen un mal funcionamiento del script si m\u00e1s adelante se necesita el resultado esperado. Los errores sin terminaci\u00f3n pueden deberse a tiempos de espera de red, archivos que no existen o problemas de permisos que, aunque no sean una excepci\u00f3n cr\u00edtica ni un error de ejecuci\u00f3n en s\u00ed, dar\u00e1n lugar a un comportamiento imprevisto si no se gestionan.<\/p>\n<h2>Conceptos b\u00e1sicos de la gesti\u00f3n de errores en PowerShell (try, catch, finally y $ErrorActionPreference)<\/h2>\n<p>Los errores de terminaci\u00f3n y las excepciones se <em>lanzan<\/em> (se produce el error) y se <em>capturan<\/em> (se ejecuta c\u00f3digo para gestionar el error). Los errores <em>no capturados<\/em> detienen la ejecuci\u00f3n de tu script de PowerShell. Si encapsulas tu c\u00f3digo en bloques <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.core\/about\/about_try_catch_finally?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">try , catch y finally<\/a>, podr\u00e1s controlar este tipo de errores.<\/p>\n<p>Si el c\u00f3digo que se ejecuta dentro de un bloque <strong>try<\/strong> lanza un error, se ejecutar\u00e1 el bloque de c\u00f3digo del <strong>catch<\/strong> correspondiente para gestionarlo (lo que permite continuar la ejecuci\u00f3n si procede). Las tareas de limpieza que quieras ejecutar tanto si se produce un error como si no pueden a\u00f1adirse a un bloque <strong>finally<\/strong>. M\u00e1s abajo en esta p\u00e1gina lo ver\u00e1s con un ejemplo de c\u00f3digo completo.<\/p>\n<p>La <a href=\"https:\/\/devblogs.microsoft.com\/scripting\/understanding-non-terminating-errors-in-powershell\/\" rel=\"noopener\" target=\"_blank\">gesti\u00f3n de errores sin terminaci\u00f3n<\/a> funciona de otro modo, ya que no se lanza ning\u00fan error que detenga la ejecuci\u00f3n y, por tanto, no se puede capturar. En su lugar, el error se guarda en la variable <strong>$Error<\/strong>, una matriz de errores a la que puedes acceder en cualquier punto de tus scripts de PowerShell para comprobar si una instrucci\u00f3n anterior gener\u00f3 un error sin terminaci\u00f3n, como en este ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Get-ChildItem -Path \"C:fake_path\"\n\nif ($Error) {\n\nWrite-Host \"Error occurred: $($Error[0])\" # Display the most recent error as a string\n\n$Error.Clear() # Clear the error\n\n}<\/pre>\n<p>Arriba, el comando de PowerShell <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.management\/get-childitem?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">Get-ChildItem<\/a> genera un error sin terminaci\u00f3n si la ruta del sistema de archivos que se le pasa no existe (en este caso, <strong>C:fake_path<\/strong>). El error queda registrado en la variable $Error, que despu\u00e9s se comprueba y se gestiona.<\/p>\n<p>Si quieres asignar la salida de error de un comando concreto a una variable personalizada, puedes usar el par\u00e1metro <strong>-ErrorVariable<\/strong> (ten en cuenta que en este caso la variable de error no es una matriz):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Get-ChildItem -Path \"C:fake_path\" -ErrorVariable customError\n\nif ($customError) {\n\nWrite-Host \"Error occurred: $customError\" # Display the error as a string\n\n}<\/pre>\n<p>Tambi\u00e9n puedes convertir los errores sin terminaci\u00f3n en errores de terminaci\u00f3n y gestionarlos con bloques try\/catch. Puedes hacerlo para todos los errores sin terminaci\u00f3n que se produzcan en el script estableciendo la variable global <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.core\/about\/about_preference_variables?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\"><strong>$ErrorActionPreference<\/strong><\/a> en <strong>Stop<\/strong>:<\/p>\n<p><code>$ErrorActionPreference = \"Stop\"<\/code><\/p>\n<p>O, si solo quieres hacerlo para los errores de un \u00fanico comando, puedes usar el par\u00e1metro <strong>-ErrorAction<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Get-ChildItem -Path \"C:fake_path\" -ErrorAction Stop<\/pre>\n<h2>C\u00f3mo implementar bloques try\/catch\/finally en PowerShell<\/h2>\n<p>A continuaci\u00f3n tienes un script de PowerShell de ejemplo que muestra la sintaxis y la estructura de los bloques try\/catch\/finally, c\u00f3mo usar varios bloques catch para distintos tipos de excepciones y c\u00f3mo emplear un bloque finally para limpiar y gestionar los errores restantes. Primero, un \u00fanico error gestionado con un bloque try\/catch:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try {\n\n# Attempt a file operation that fails\n\nGet-Content -Path \"C:fake_pathfake_file.txt\" -ErrorAction Stop\n\n} catch {\n\nWrite-Host \"Exception caught: $($_.Exception.Message)\"\n\n}<\/pre>\n<p>Tambi\u00e9n puedes gestionar varios tipos de errores posibles en un solo bloque <strong>try<\/strong>, con un bloque <strong>catch<\/strong> propio para cada uno:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try {\n\n# Each of the below commands will throw a terminating error of a different type\n\nGet-Content -Path \"C:fake_pathfake_file.txt\" -ErrorAction Stop # Attempt a file operation that fails to throw a ItemNotFoundException\n\n$null.fakeFunction() # Attempt to run a non-existent method on a null object to throw a RuntimeException\n\n$divideZero = 1\/0 # Divide by zero to throw an exception that won't be specifically caught\n\n} catch [System.Management.Automation.ItemNotFoundException] { # Catch the specific error thrown by Get-Content\n\nWrite-Host \"Item not found exception caught: $($_.Exception.Message)\"\n\n} catch [System.Management.Automation.RuntimeException] { # Catch the specific error thrown by $null.fakeFunction\n\nWrite-Host \"Runtime exception caught: $($_.Exception.Message)\"\n\n} catch { # Catch all other errors\n\n# General catch block for any other exceptions\n\nWrite-Host \"General exception caught: $($_.Exception.Message)\"\n\n} finally { # The finally block is always executed whether an exception was thrown or not.\n\nWrite-Host \"Executing the finally block.\"\n\n$Error.Clear() # This could, for example, be used to clean up non-terminating errors.\n\n}<\/pre>\n<p>La finalidad de cada instrucci\u00f3n se explica en el propio c\u00f3digo para que veas en su contexto completo c\u00f3mo funcionan juntas las instrucciones <strong>try<\/strong>, <strong>catch<\/strong> y <strong>finally<\/strong>. Ten en cuenta que, si se producen varios errores de terminaci\u00f3n en el mismo bloque <strong>try<\/strong>, solo se capturar\u00e1 y gestionar\u00e1 el primero y, a continuaci\u00f3n, se ejecutar\u00e1 el bloque <strong>finally<\/strong>. Una vez corregido ese error, los siguientes se capturar\u00e1n en la siguiente ejecuci\u00f3n del script.<\/p>\n<h2>T\u00e9cnicas avanzadas de gesti\u00f3n de errores y ejemplos<\/h2>\n<p>Tambi\u00e9n es posible anidar bloques try\/catch para que los errores vayan \u00absubiendo\u00bb a trav\u00e9s de ellos. As\u00ed puedes gestionar errores concretos en los bloques try\/catch internos y tratar en los bloques externos cualquier error no capturado o relanzado, incluidos los que se produzcan dentro de tus bloques <strong>catch<\/strong> internos. Por ejemplo, podr\u00edas usar bloques anidados para gestionar errores espec\u00edficos y despu\u00e9s un \u00fanico bloque externo para capturar y registrar todos los errores, en lugar de repetir el c\u00f3digo de registro en cada catch interno.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try { # Beginning of the outer catch block\n\ntry { # Beginning of the inner catch block\n\n# Include potentially error-causing code here\n\nGet-Content -Path \"C:fake_pathfake_file.txt\" -ErrorAction Stop\n\n} catch [System.Management.Automation.ItemNotFoundException] { # Catch statement for the inner catch block that specifically handles ItemNotFoundException\n\nWrite-Host \"Inner try block file not found exception caught: $($_.Exception.Message)\"\n\n} catch { # Catch statement for the inner catch block that handles all other exceptions\n\nWrite-Host \"Inner try block exception caught: $($_.Exception.Message)\"\n\nthrow # Re-throw the exception so that it will bubble up to the outer try\/catch block\n\n}\n\n} catch { # Catch statement for the outer catch block\n\nWrite-Host \"Outer try block exception caught: $($_.Exception.Message)\" # Handle all errors re-thrown in the inner catch blocks here for clean up, logging, and alerting tasks\n\n}<\/pre>\n<p>F\u00edjate en que, en el ejemplo anterior, la excepci\u00f3n <strong>ItemNotFoundException<\/strong> no se relanza, as\u00ed que no subir\u00e1 hasta el bloque catch externo.<\/p>\n<p>A medida que ampl\u00edes tus scripts de PowerShell para cubrir tus propios casos de uso, probablemente querr\u00e1s poder crear tus propias excepciones personalizadas y <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/windows-powershell-error-records?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">registros de error<\/a> de PowerShell:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try {\n\n$customException = New-Object Exception \"This is a custom error!\" # Create and throw a custom error\n\n# Create a custom Error Record\n\n$customErrorRecord = New-Object System.Management.Automation.ErrorRecord (\n\n$customException,\n\n\"CustomErrorID\",\n\n[System.Management.Automation.ErrorCategory]::NotSpecified, # Sets the ErrorRecord category to NotSpecified\n\n$null # Specify no specific target object for this error\n\n)\n\nthrow $customErrorRecord\n\n} catch {\n\n# Catch and handle the custom error record\n\nWrite-Host \"Error Message: $($_.Exception.Message)\"\n\nWrite-Host \"Error ID: $($_.FullyQualifiedErrorId)\"\n\n}<\/pre>\n<p>Arriba puedes ver que no se especifica ning\u00fan objeto de destino (est\u00e1 establecido en <strong>$null<\/strong>). En su lugar podr\u00edas indicar una ruta de archivo u otra referencia y a\u00f1adir m\u00e1s detalle al texto de la excepci\u00f3n para que el error personalizado resulte m\u00e1s informativo.<\/p>\n\n<h2>Buenas pr\u00e1cticas de gesti\u00f3n de errores en PowerShell<\/h2>\n<p>Hay varias buenas pr\u00e1cticas que conviene seguir al escribir tus scripts de PowerShell para que la gesti\u00f3n de errores sea realmente eficaz:<\/p>\n<ul>\n<li><strong>Escribe mensajes de error claros y predecibles<\/strong>: tus mensajes deben ser descriptivos e incluir suficiente informaci\u00f3n de la excepci\u00f3n o del <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/interpreting-errorrecord-objects?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">objeto ErrorRecord<\/a> para identificar la causa concreta del error.<\/li>\n<li><strong>Aseg\u00farate de que tus scripts puedan seguir ejecut\u00e1ndose (o salir de forma controlada) cuando se produzca un error<\/strong>: si tus scripts est\u00e1n ejecutando otras tareas, quiz\u00e1 te interese gestionar el error y dejar que contin\u00faen. Los errores que impidan continuar deber\u00edan hacer que el script salga con un <a href=\"https:\/\/devblogs.microsoft.com\/powershell\/windows-powershell-exit-codes\/\" rel=\"noopener\" target=\"_blank\">c\u00f3digo de salida<\/a>, y el resultado de cualquier error deber\u00eda registrarse y notificarse.<\/li>\n<li><strong>Pon a prueba con regularidad tu sistema de gesti\u00f3n de errores y de informes<\/strong>: tus automatizaciones en PowerShell no sirven de nada si fallan sin que te enteres. Prueba tus scripts peri\u00f3dicamente provocando errores a prop\u00f3sito para comprobar que la gesti\u00f3n funciona, que los detalles se registran y que recibes el aviso.<\/li>\n<\/ul>\n<p>La gesti\u00f3n de errores es una funci\u00f3n importante del scripting en PowerShell y resulta muy \u00fatil mientras desarrollas tus habilidades de scripting y automatizaci\u00f3n. Implementarla correctamente \u2014lanzando bien los errores, usando bloques try\/catch\/finally y aprovechando $ErrorActionPreference\u2014 te ayudar\u00e1 a <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/hoja-referencia-comandos-windows-powershell\/\">aprender la sintaxis de PowerShell<\/a>, te dar\u00e1 mejor visibilidad sobre los problemas que encuentren tus scripts y te permitir\u00e1 gestionarlos mejor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PowerShell es la l\u00ednea de comandos y el lenguaje de scripting principal de los sistemas operativos Windows. Permite ejecutar programas y realizar tareas de gesti\u00f3n del sistema desde el terminal, y lo usan ampliamente los administradores de sistemas y los desarrolladores para automatizar sus flujos de trabajo. La gesti\u00f3n de errores es una parte fundamental [&hellip;]<\/p>\n","protected":false},"author":35,"featured_media":269612,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[4357],"tags":[],"class_list":["post-897025","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-operaciones-de-ti"],"acf":[],"modified_by":null,"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/posts\/897025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/comments?post=897025"}],"version-history":[{"count":1,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/posts\/897025\/revisions"}],"predecessor-version":[{"id":897026,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/posts\/897025\/revisions\/897026"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media\/269612"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=897025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/categories?post=897025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/tags?post=897025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}