Saltar al contenido

Error personalizado de parámetros en PowerShell

Basta ya de indagar por todo internet porque llegaste al sitio adecuado, contamos con la solución que buscas pero sin liarte.

Solución:

Su ValidateScript debería verse algo como esto:

[ValidateScript(
    try 
        $Folder = Get-Item $_ -ErrorAction Stop
     catch [System.Management.Automation.ItemNotFoundException] 
        Throw [System.Management.Automation.ItemNotFoundException] "$_ Maybe there are network issues?"
    
    if ($Folder.PSIsContainer) 
        $True
     else 
        Throw [System.Management.Automation.ValidationMetadataException] "The path '$_' is not a container."
    
)]

Eso te dará un mensaje como este:

Carpeta de prueba: no se puede validar el argumento en el parámetro ‘Carpeta’. No se puede encontrar la ruta ‘\servidorTempasdf’ porque no existe. Tal vez hay problemas de red?

O:

Carpeta de prueba: no se puede validar el argumento en el parámetro ‘Carpeta’. La ruta ‘\serverTempasdf’ no es un contenedor.

Si las versiones anteriores de PowerShell arrojan un error doble, es posible que deba probar dentro de la función:

Function Test-Folder 
    Param (
        [parameter(Mandatory=$true)]
        [String]$Folder
    )

    try 
        $Folder = Get-Item $_ -ErrorAction Stop
     catch [System.Management.Automation.ItemNotFoundException] 
        Throw [System.Management.Automation.ItemNotFoundException] "The '$Folder' is not found, maybe there are network issues?"
    

    if (-not $Folder.PSIsContainer) 
        Throw [System.Management.Automation.ApplicationFailedException] "The path '$_' is not a container."
    

    Write-Host "The folder is: $Folder"

La parte que siempre odié en PowerShell fue tratar de averiguar qué error detectar; sin atrapar a todos. Ya que finalmente lo descubrí, así es como:

PS > Resolve-Path 'asdf'
Resolve-Path : Cannot find path '.asdf' because it does not exist.
At line:1 char:1
+ Resolve-Path 'asdf'
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (asdf:String) [Resolve-Path], ItemNotFoundE
   xception
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.ResolvePathCommand

PS > $Error[0].Exception.GetType().FullName
System.Management.Automation.ItemNotFoundException

solo puedes hacer

ValidateScript(Test-Path $_ -PathType Container, ErrorMessage="Must exist")]

Eso te da mensajes de error como:

Cannot validate argument on parameter 'Folder'. Must exist

Al menos en las versiones actuales de powershell (7.x al momento de escribir esto).

En general, para los desarrolladores que solo usan PowerShell, cuando usa attributes (Cosas como [ValidateScript), a veces también puede establecer propiedades adicionales con la sintaxis anterior. Para ver qué propiedades, puede simplemente buscar en Google el nombre del attribute con el postfijo “Atributo”, por ejemplo, “ValidateScriptAttribute”, y luego mire la sección “Propiedades” para ver todas las propiedades que se pueden escribir.

Creo que has encontrado las soluciones sencillas.

La lógica de validación de parámetros es extensible, pero requiere algo de C#. Si implementa la clase abstracta System.Management.Automation.ValidateArgumentsAttribute, su implementación puede generar una System.Management.Automation.ValidationMetadtaException que PowerShell usará para informar el error y, naturalmente, puede usar cualquier mensaje que desee al crear esa excepción.

Si te ha resultado provechoso nuestro artículo, sería de mucha ayuda si lo compartes con el resto entusiastas de la programación de este modo contrubuyes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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