È possibile impostare il parametro da utilizzare uno script di convalida in questo modo:
Function DoStuff-WithFiles{
Param([Parameter(Mandatory=$true,ValueFromPipeline)]
[ValidateScript({
If(Test-Path $_){$true}else{Throw "Invalid path given: $_"}
})]
[String[]]$FilePath)
Process{
"Valid path: $FilePath"
}
}
Si raccomanda per non passare semplicemente $ true/$ false perché la funzione non fornisce buoni messaggi di errore, utilizzare invece un Throw, come ho fatto sopra. Quindi puoi chiamarlo come una funzione, o pipe string, ed elabora quelli che superano la validazione, e lancia l'errore nell'istruzione Throw per quelli che non passano. Per esempio io passerò un percorso valido (C: \ Temp) e un percorso non valido (C: \ No) per la funzione e si può vedere i risultati:
@("c:\temp","C:\Nope")|DoStuff-WithFiles
Valid path: c:\temp
DoStuff-WithFiles : Cannot validate argument on parameter 'FilePath'. Invalid path given: C:\Nope
At line:1 char:24
+ @("c:\temp","C:\Nope")|DoStuff-WithFiles
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (C:\Nope:String) [DoStuff-WithFiles], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,DoStuff-WithFiles
Edit: ho parzialmente ritrarre il tiro commento. Evidentemente dà errori descrittivi quando la validazione fallisce adesso (grazie Paul!). Avrei potuto giurarlo (almeno usato) appena ha dato un errore affermando che non ha superato la convalida e lasciato fuori ciò che stava convalidando e ciò che stava validando contro. Per script di convalida più complessi, utilizzerei comunque Throw anche perché l'utente dello script potrebbe non sapere che cosa significa $_ -match '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
se l'errore lo genera (indirizzo IPv4 di convalida).
'-Path' accetta un array di stringhe in modo da poterlo fare. http://technet.microsoft.com/en-us/library/hh849776.aspx – Matt