Ada beberapa jawaban bagus di sini, tetapi saya ingin menunjukkan beberapa hal lain. Parameter fungsi sebenarnya adalah tempat PowerShell bersinar. Misalnya, Anda dapat memiliki parameter bernama atau posisional dalam fungsi lanjutan seperti:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Kemudian Anda bisa memanggilnya dengan menentukan nama parameter, atau Anda bisa menggunakan parameter posisi, karena Anda secara eksplisit mendefinisikannya. Jadi salah satu dari ini akan berhasil:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Contoh pertama berfungsi meskipun Name
disediakan kedua, karena kami secara eksplisit menggunakan nama parameter. Contoh kedua bekerja berdasarkan posisi, jadiName
perlu menjadi yang pertama. Jika memungkinkan, saya selalu mencoba menentukan posisi sehingga kedua opsi tersedia.
PowerShell juga memiliki kemampuan untuk mendefinisikan set parameter. Ini menggunakan ini sebagai pengganti metode overloading, dan sekali lagi cukup berguna:
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
)
}
Sekarang fungsi akan mengambil nama, atau id, tetapi tidak keduanya. Anda dapat menggunakannya secara posisi, atau dengan nama. Karena mereka adalah tipe yang berbeda, PowerShell akan mencari tahu. Jadi semua ini akan berhasil:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
Anda juga dapat menetapkan parameter tambahan ke berbagai set parameter. (Itu contoh yang cukup mendasar.) Di dalam fungsi, Anda dapat menentukan set parameter mana yang digunakan dengan properti $ PsCmdlet.ParameterSetName. Sebagai contoh:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Kemudian, di sisi catatan terkait, ada juga validasi parameter di PowerShell. Ini adalah salah satu fitur PowerShell favorit saya, dan itu membuat kode di dalam fungsi Anda sangat bersih. Ada banyak validasi yang dapat Anda gunakan. Beberapa contoh adalah:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
Pada contoh pertama, ValidatePattern menerima ekspresi reguler yang memastikan parameter yang disediakan sesuai dengan yang Anda harapkan. Jika tidak, pengecualian intuitif dilontarkan, memberi tahu Anda apa yang salah. Jadi dalam contoh itu, 'Sesuatu' akan berfungsi dengan baik, tetapi 'Musim Panas' tidak akan lulus validasi.
ValidateRange memastikan bahwa nilai parameter berada di antara rentang yang Anda harapkan untuk bilangan bulat. Jadi 10 atau 99 akan bekerja, tetapi 101 akan mengeluarkan pengecualian.
Satu lagi yang berguna adalah ValidateSet, yang memungkinkan Anda untuk secara eksplisit mendefinisikan array nilai yang dapat diterima. Jika sesuatu dimasukkan, pengecualian akan dilempar. Ada yang lain juga, tapi mungkin yang paling berguna adalah ValidateScript. Ini membutuhkan blok skrip yang harus dievaluasi menjadi $ true, jadi langit adalah batasnya. Sebagai contoh:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
Dalam contoh ini, kami diyakinkan tidak hanya bahwa $ Path ada, tetapi bahwa itu adalah file, (sebagai lawan dari direktori) dan memiliki ekstensi .csv. ($ _ merujuk pada parameter, ketika di dalam scriptblock Anda.) Anda juga dapat mengirimkan blok skrip multi-baris yang jauh lebih besar jika level itu diperlukan, atau menggunakan beberapa scriptblock seperti yang saya lakukan di sini. Ini sangat berguna dan membuat fungsi bersih yang bagus dan pengecualian intuitif.
Test "ABC" "DEF"