Burada bazı iyi cevaplar var, ama birkaç başka noktayı daha belirtmek istedim. İşlev parametreleri aslında PowerShell'in parladığı bir yerdir. Örneğin, aşağıdaki gibi gelişmiş işlevlerde adlandırılmış veya konumsal parametreleriniz olabilir:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Daha sonra parametre adını belirterek arayabilir veya bunları açıkça tanımladığınız için yalnızca konum parametrelerini kullanabilirsiniz. Yani bunlardan biri işe yarayacaktır:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Name
Parametre adını açıkça kullandığımız için, ilk örnek ikincisi sağlansa bile çalışır . İkinci örnek yine de konuma göre çalışır, bu yüzden Name
ilk olması gerekir. Mümkün olduğunda, her zaman iki seçenek de mevcut olacak şekilde konumları tanımlamaya çalışırım.
PowerShell ayrıca parametre kümelerini tanımlama özelliğine sahiptir. Bunu yöntem aşırı yüklemesi yerine kullanır ve yine oldukça yararlıdır:
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
)
}
Şimdi işlev bir isim veya kimlik alacak, ancak her ikisini birden almayacak. Bunları konumsal olarak veya ada göre kullanabilirsiniz. Farklı bir tür olduklarından, PowerShell bunu anlayacaktır. Yani bunların hepsi işe yarayacaktı:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
Çeşitli parametre setlerine ek parametreler de atayabilirsiniz. (Bu oldukça basit bir örnektir.) İşlev içinde, $ PsCmdlet.ParameterSetName özelliğiyle hangi parametre kümesinin kullanıldığını belirleyebilirsiniz. Örneğin:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Ardından, ilgili bir yan notta, PowerShell'de de parametre doğrulaması vardır. Bu benim en sevdiğim PowerShell özelliklerinden biri ve işlevlerinizin içindeki kodu çok temiz yapıyor. Kullanabileceğiniz çok sayıda doğrulama vardır. Birkaç örnek:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
İlk örnekte ValidatePattern, sağlanan parametrenin beklediğinizle eşleştiğini garanti eden normal bir ifadeyi kabul eder. Değilse, tam olarak neyin yanlış olduğunu söyleyen sezgisel bir istisna atılır. Bu örnekte, 'Bir şey' işe yarayacaktır, ancak 'Yaz' onaylamayı geçmeyecektir.
ValidateRange, parametre değerinin bir tamsayı için beklediğiniz aralık arasında olmasını sağlar. Yani 10 ya da 99 işe yarayacaktı, ama 101 istisna fırlatacaktı.
Bir başka yararlı olan, açıkça kabul edilebilir değerler dizisini tanımlamanızı sağlayan ValidateSet'dir. Başka bir şey girilirse, bir istisna atılır. Başkaları da var, ama muhtemelen en faydalı olanı ValidateScript. Bu, $ true olarak değerlendirilmesi gereken bir komut dosyası bloğu alır, bu nedenle gökyüzü sınırdır. Örneğin:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
Bu örnekte, yalnızca $ Yolunun var olduğu değil, aynı zamanda bir dosya (dizin yerine) olduğunu ve .csv uzantısına sahip olduğunu garanti ediyoruz. ($ _, scriptblock'unuzun içindeyken parametreyi ifade eder.) Bu düzey gerekiyorsa çok daha büyük, çok satırlı komut dosyası blokları da iletebilir veya burada yaptığım gibi birden çok komut dosyası bloğu kullanabilirsiniz. Son derece yararlıdır ve hoş temiz işlevler ve sezgisel istisnalar sağlar.
Test "ABC" "DEF"