Jika saya memiliki fungsi yang menerima lebih dari satu parameter string, parameter pertama tampaknya mendapatkan semua data yang ditugaskan padanya, dan parameter yang tersisa dilewatkan sebagai kosong.
Skrip pengujian cepat:
Function Test([string]$arg1, [string]$arg2)
{
Write-Host "`$arg1 value: $arg1"
Write-Host "`$arg2 value: $arg2"
}
Test("ABC", "DEF")
Output yang dihasilkan adalah
$arg1 value: ABC DEF
$arg2 value:
Output yang benar adalah:
$arg1 value: ABC
$arg2 value: DEF
Ini tampaknya konsisten antara v1 dan v2 pada banyak mesin, jadi jelas, saya melakukan sesuatu yang salah. Adakah yang bisa menunjukkan dengan tepat apa?
powershell
Nasir
sumber
sumber
Test "ABC" "DEF"
Jawaban:
Parameter dalam panggilan ke fungsi di PowerShell (semua versi) dipisahkan oleh ruang, bukan dipisahkan oleh koma . Selain itu, tanda kurung sama sekali tidak perlu dan akan menyebabkan kesalahan parse di PowerShell 2.0 (atau lebih baru) jika
Set-StrictMode
aktif. Argumen parenthesised digunakan dalam metode .NET saja.sumber
(1,2,3)
fungsi diperlakukan secara efektif sebagai array; satu argumen. Jika Anda ingin menggunakan argumen gaya metode OO, gunakan modul:$m = new-module -ascustomobject { function Add($x,$y) { $x + $y } }; $m.Add(1,1)
Powershell
adalah bahasa shell dan itu umum bagi bahasa shell untuk menggunakan spasi sebagai pemisah token. Saya tidak akan mengatakanPowershell
sedang berbeda di sini, itu benar sejalan dengan kerang default sistem lain seperticmd
,sh
,bash
, dllJawaban yang benar telah diberikan, tetapi masalah ini tampaknya cukup lazim untuk menjamin beberapa detail tambahan bagi mereka yang ingin memahami seluk-beluk.
Saya ingin menambahkan ini hanya sebagai komentar, tetapi saya ingin menyertakan ilustrasi - Saya merobeknya dari bagan referensi cepat saya pada fungsi PowerShell. Ini mengasumsikan fungsi tanda tangan f adalah
f($a, $b, $c)
:Dengan demikian, seseorang dapat memanggil fungsi dengan parameter posisi yang dipisah-ruang atau parameter bernama bebas-pesanan . Jebakan lain mengungkapkan bahwa Anda harus menyadari koma, tanda kurung, dan ruang putih.
Untuk bacaan lebih lanjut, lihat artikel saya Down the Rabbit Hole: A Study in PowerShell Pipelines, Functions, and Parameters . Artikel ini juga memuat tautan ke bagan referensi / dinding cepat.
sumber
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:
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:
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:
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:
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:
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:
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:
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.
sumber
My_Function -NamedParamater "ParamValue"
gaya panggilan fungsi. Ini adalah pola yang harus diikuti lebih banyak kode skrip PS agar mudah dibaca.Anda memanggil fungsi PowerShell tanpa tanda kurung dan tanpa menggunakan koma sebagai pemisah. Coba gunakan:
Di PowerShell koma (,) adalah operator array, mis
Ini diatur
$a
ke array dengan tiga nilai.sumber
sumber
Jika Anda seorang pengembang C # / Java / C ++ / Ruby / Python / Pick-A-Bahasa-Dari-Abad Ini dan Anda ingin memanggil fungsi Anda dengan koma, karena itulah yang selalu Anda lakukan, maka Anda memerlukan sesuatu seperti ini:
Sekarang telepon:
dan kamu akan lihat
sumber
Jika Anda tidak tahu (atau peduli) berapa banyak argumen yang akan Anda sampaikan ke fungsi, Anda juga bisa menggunakan pendekatan yang sangat sederhana seperti;
Kode :
Itu akan mencetak semua argumen. Sebagai contoh:
Keluaran
Saya menemukan ini sangat berguna ketika membuat fungsi yang menggunakan perintah eksternal yang dapat memiliki banyak parameter (dan opsional) yang berbeda, tetapi bergantung pada perintah tersebut untuk memberikan umpan balik pada kesalahan sintaks, dll.
Ini adalah contoh dunia nyata lain (membuat fungsi untuk perintah tracert, yang saya benci harus mengingat nama terpotong);
Kode :
sumber
Jika kamu mencoba:
Anda mendapatkan:
Jadi Anda melihat bahwa tanda kurung memisahkan parameter
Jika kamu mencoba:
Anda mendapatkan:
Sekarang Anda dapat menemukan kegunaan langsung tanda kurung - spasi tidak akan menjadi pemisah untuk parameter berikutnya - sebagai gantinya Anda memiliki fungsi eval.
sumber
@
) sebelum paren terkemuka, seperti array kosong ini:@()
; atau array ini dengan dua angka:@(1, 2)
.Karena ini adalah pertanyaan yang sering dilihat, saya ingin menyebutkan bahwa fungsi PowerShell harus menggunakan kata kerja yang disetujui ( Verb-Noun sebagai nama fungsi). Bagian kata kerja dari nama mengidentifikasi tindakan yang dilakukan cmdlet. Bagian kata benda dari nama mengidentifikasi entitas tempat tindakan dilakukan. Aturan ini disederhanakan penggunaan cmdlet Anda untuk pengguna PowerShell tingkat lanjut.
Anda juga dapat menentukan hal-hal seperti apakah parameter itu wajib dan posisi parameter:
Untuk meneruskan parameter ke fungsi, Anda dapat menggunakan posisi :
Atau Anda menentukan nama parameter :
Anda tidak menggunakan tanda kurung seperti yang Anda lakukan ketika Anda memanggil fungsi dalam C #.
Saya akan merekomendasikan untuk selalu memberikan nama parameter ketika menggunakan lebih dari satu parameter, karena ini lebih mudah dibaca .
sumber
Get-Node
cmdlet. Jelas bagi kita bahwa kita harus memohonGet-Node
, tidakRetrieve-Node
, tidakReceive-Node
, atau .....Saya tidak tahu apa yang Anda lakukan dengan fungsi ini, tetapi coba lihat menggunakan kata kunci 'param'. Ini sedikit lebih kuat untuk melewatkan parameter ke suatu fungsi, dan membuatnya lebih ramah pengguna. Di bawah ini adalah tautan ke artikel yang terlalu rumit dari Microsoft tentang hal itu. Itu tidak serumit artikel membuatnya terdengar.
Penggunaan Param
Juga, ini adalah contoh dari sebuah pertanyaan di situs ini:
Coba lihat.
sumber
sumber
Saya menyatakan yang berikut sebelumnya:
Masalah umum adalah menggunakan bentuk tunggal
$arg
, yang tidak benar. Itu harus selalu jamak sebagai$args
.Masalahnya bukan itu. Faktanya,
$arg
bisa jadi apa saja. Masalahnya adalah penggunaan koma dan tanda kurung.Saya menjalankan kode berikut ini yang berfungsi dan hasilnya mengikuti:
Kode:
Tes "ABC" "DEF"
Keluaran:
sumber
Ini tepat
params
deklarasi yang .Lihat about_Functions_Advanced_Parameters .
Dan itu memang berhasil.
sumber
Anda dapat melewatkan parameter dalam fungsi seperti ini juga:
sumber
Saya tidak melihatnya disebutkan di sini, tetapi menampar argumen Anda adalah alternatif yang berguna dan menjadi sangat berguna jika Anda membangun argumen ke perintah secara dinamis (sebagai lawan menggunakan
Invoke-Expression
). Anda dapat memerciki array untuk argumen posisi dan hashtable untuk argumen bernama. Berikut ini beberapa contohnya:Percikan Dengan Array (Argumen Posisi)
Tes-Koneksi dengan Argumen Posisi
Dengan Array Splatting
Percik Dengan Hashtable (Argumen Bernama)
Tes-Koneksi dengan Argumen Bernama
Dengan Hashtable Splatting
Argumen Posisional dan Dinamai Argumen Secara Bersamaan
Tes-Koneksi Dengan Argumen Baik Posisi dan Named
Memecah Array dan Hashtable Bersama
sumber