Ci sono alcune buone risposte qui, ma volevo sottolineare un paio di altre cose. I parametri di funzione sono in realtà un luogo in cui brilla PowerShell. Ad esempio, puoi avere parametri nominali o posizionali in funzioni avanzate in questo modo:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Quindi puoi chiamarlo specificando il nome del parametro oppure puoi semplicemente usare i parametri posizionali, dal momento che li hai definiti esplicitamente. Quindi uno di questi funzionerebbe:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Il primo esempio funziona anche se Name
viene fornito secondo, perché abbiamo usato esplicitamente il nome del parametro. Il secondo esempio funziona in base alla posizione, quindi Name
dovrebbe essere il primo. Quando possibile, cerco sempre di definire le posizioni in modo che entrambe le opzioni siano disponibili.
PowerShell ha anche la capacità di definire set di parametri. Lo utilizza al posto del sovraccarico del metodo ed è di nuovo abbastanza utile:
function Get-Something
{
[CmdletBinding(DefaultParameterSetName='Name')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
[string] $Name,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
[int] $Id
)
}
Ora la funzione prenderà un nome o un id, ma non entrambi. Puoi usarli in posizione, o per nome. Poiché sono di tipo diverso, PowerShell lo scoprirà. Quindi tutti questi funzionerebbero:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
È inoltre possibile assegnare parametri aggiuntivi ai vari set di parametri. (Questo è stato un esempio piuttosto semplice.) All'interno della funzione, è possibile determinare quale set di parametri è stato utilizzato con la proprietà $ PsCmdlet.ParameterSetName. Per esempio:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Quindi, in una nota a margine correlata, c'è anche la convalida dei parametri in PowerShell. Questa è una delle mie funzionalità preferite di PowerShell e rende il codice all'interno delle tue funzioni molto pulito. Esistono numerose convalide che puoi utilizzare. Un paio di esempi sono:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
Nel primo esempio, ValidatePattern accetta un'espressione regolare che assicura che il parametro fornito corrisponda a quello che ti aspetti. In caso contrario, viene generata un'eccezione intuitiva, che ti dice esattamente cosa non va. Quindi, in questo esempio, "Something" funzionerebbe bene, ma "Summer" non avrebbe superato la convalida.
ValidateRange garantisce che il valore del parametro sia compreso nell'intervallo previsto per un numero intero. Quindi 10 o 99 funzionerebbero, ma 101 genererebbe un'eccezione.
Un altro utile è ValidateSet, che consente di definire esplicitamente una matrice di valori accettabili. Se viene inserito qualcos'altro, verrà generata un'eccezione. Ce ne sono anche altri, ma probabilmente il più utile è ValidateScript. Questo richiede un blocco di script che deve essere valutato in $ true, quindi il limite è il cielo. Per esempio:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
In questo esempio, ci viene assicurato non solo che esiste $ Path, ma che è un file (al contrario di una directory) e ha un'estensione .csv. ($ _ si riferisce al parametro, all'interno del tuo scriptblock.) Puoi anche passare a blocchi di script multilinea molto più grandi se è richiesto quel livello, oppure usare più blocchi di script come ho fatto qui. È estremamente utile e rende piacevoli funzioni pulite ed eccezioni intuitive.
Test "ABC" "DEF"