2014-10-24 1 views
9

Ho una funzione che accetta un parametro array di stringhe di file e vorrei utilizzare Test-Path (o qualcos'altro) per garantire che tutti i file nel parametro dell'array di stringhe esistano. Mi piacerebbe farlo nella dichiarazione dei parametri, se possibile.In PowerShell, è possibile utilizzare Test-Path (o qualcos'altro) per convalidare più file quando si dichiara un parametro dell'array stringa

È possibile?

+0

'-Path' accetta un array di stringhe in modo da poterlo fare. http://technet.microsoft.com/en-us/library/hh849776.aspx – Matt

risposta

15

È possibile utilizzare ValidateScript

param(
[parameter()] 
[ValidateScript({Test-Path $_ })] 
[string[]]$paths 
) 

Per ulteriori documentazione sul parametro visita convalida about_Functions_Advanced_Parameters

5

È 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).

+0

l'output predefinito di ValidateScript includerà anche l'elemento che ha avuto esito negativo, purché si modifichi solo che la dichiarazione di lancio mi sembra ridondante – Paul

+0

Lo fa ora? Pensavo che fornisse solo messaggi di errore abbastanza inutili. Forse è cambiato da quando ho appreso su ValidateScript – TheMadTechnician

+0

sulla mia macchina (v4) lo fa – Paul

1

Come ha detto @Matt. Test-Path accetta già l'immissione in pipeline, in modo da realmente basta inviare la matrice direttamente in:

@($path1, $path2) | Test-Path 

Che poi ritorna:

> @("C:\foo", "C:\Windows") | Test-Path 
False 
True 

Se si vuole solo sapere se tutti loro esistono:

($pathArray | Test-Path) -notcontains $false 

che produce:

False