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.