Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Catatan editorial
Penting
Spesifikasi Bahasa Windows PowerShell 3.0 diterbitkan pada Desember 2012 dan didasarkan pada Windows PowerShell 3.0. Spesifikasi ini tidak mencerminkan status PowerShell saat ini. Tidak ada rencana untuk memperbarui dokumentasi ini untuk mencerminkan status saat ini. Dokumentasi ini disajikan di sini untuk referensi historis.
Dokumen spesifikasi tersedia sebagai dokumen Microsoft Word dari Pusat Unduh Microsoft di: https://www.microsoft.com/download/details.aspx?id=36389 Dokumen Word telah dikonversi untuk presentasi di sini di Microsoft Pelajari. Selama konversi, beberapa perubahan editorial telah dilakukan untuk mengakomodasi pemformatan untuk platform Dokumen. Beberapa kesalahan ketik dan kesalahan kecil telah dikoreksi.
8.1 Blok pernyataan dan daftar
Sintaksis:
Tips
Notasi ~opt~ dalam definisi sintaks menunjukkan bahwa entitas leksikal bersifat opsional dalam sintaks.
statement-block:
new-lines~opt~ { statement-list~opt~ new-lines~opt~ }
statement-list:
statement
statement-list statement
statement:
if-statement
label~opt~ labeled-statement
function-statement
flow-control-statement statement-terminator
trap-statement
try-statement
data-statement
inlinescript-statement
parallel-statement
sequence-statement
pipeline statement-terminator
statement-terminator:
;
new-line-character
Deskripsi:
Pernyataan menentukan semacam tindakan yang akan dilakukan. Kecuali ditunjukkan sebaliknya dalam klausul ini, pernyataan dijalankan dalam urutan leksikal.
A blok pernyataan memungkinkan serangkaian pernyataan dikelompokkan ke dalam satu unit sintaksis.
8.1.1 Pernyataan berlabel
Sintaksis:
labeled-statement:
switch-statement
foreach-statement
for-statement
while-statement
do-statement
Deskripsi:
Pernyataan perulangan (§8,4) atau pernyataan pengalihan (§8,6) dapat secara opsional didahului segera oleh satu label pernyataan, label. Label pernyataan digunakan sebagai target opsional dari pernyataan break (§8.5.1) atau continue (§8.5.2). Namun, label tidak mengubah alur kontrol.
Spasi kosong tidak diizinkan antara titik dua (:) dan token yang mengikutinya.
Contoh:
:go_here while ($j -le 100) {
# ...
}
:labelA
for ($i = 1; $i -le 5; ++$i) {
:labelB
for ($j = 1; $j -le 3; ++$j) {
:labelC
for ($k = 1; $k -le 2; ++$k) {
# ...
}
}
}
8.1.2 Nilai pernyataan
Nilai pernyataan adalah kumpulan nilai kumulatif yang ditulisnya ke alur. Jika pernyataan menulis nilai skalar tunggal, itu adalah nilai pernyataan. Jika pernyataan memasukkan beberapa nilai, maka nilai dari pernyataan tersebut merupakan kumpulan nilai yang disimpan dalam elemen-elemen array satu dimensi tanpa batasan, sesuai urutan penulisannya. Pertimbangkan contoh berikut:
$v = for ($i = 10; $i -le 5; ++$i) { }
Tidak ada iterasi perulangan dan tidak ada yang ditulis ke pipeline. Nilai pernyataan adalah $null.
$v = for ($i = 1; $i -le 5; ++$i) { }
Meskipun perulangan dilakukan lima kali, tidak ada yang ditulis ke dalam saluran. Nilai pernyataan adalah $null.
$v = for ($i = 1; $i -le 5; ++$i) { $i }
Perulangan berlangsung lima kali, setiap kali menulis nilai int ke pipeline $i. Nilai pernyataan adalah object[] dengan panjang 5.
$v = for ($i = 1; $i -le 5; ) { ++$i }
Meskipun perulangan dilakukan lima kali, tidak ada yang ditulis ke dalam saluran. Nilai pernyataan adalah $null.
$v = for ($i = 1; $i -le 5; ) { (++$i) }
Perulangan berjalan sebanyak lima kali dengan setiap nilai ditulis ke saluran. Nilai pernyataan adalah object[] dengan panjang 5.
$i = 1; $v = while ($i++ -lt 2) { $i }
Perulangan berulang sekali. Nilai pernyataan adalah int dengan nilai 2.
Berikut adalah beberapa contoh lainnya:
# if $count is not currently defined then define it with int value 10
$count = if ($count -eq $null) { 10 } else { $count }
$i = 1
$v = while ($i -le 5) {
$i # $i is written to the pipeline
if ($i -band 1) {
"odd" # conditionally written to the pipeline
}
++$i # not written to the pipeline
}
# $v is object[], Length 8, value 1,"odd",2,3,"odd",4,5,"odd"
8.2 Pernyataan Pipeline
Sintaksis:
pipeline:
assignment-expression
expression redirections~opt~ pipeline-tail~opt~
command verbatim-command-argument~opt~ pipeline-tail~opt~
assignment-expression:
expression assignment-operator statement
pipeline-tail:
| new-lines~opt~ command
| new-lines~opt~ command pipeline-tail
command:
command-name command-elements~opt~
command-invocation-operator command-module~opt~ command-name-expr command-elements~opt~
command-invocation-operator: one of
& .
command-module:
primary-expression
command-name:
generic-token
generic-token-with-subexpr
generic-token-with-subexpr:
No whitespace is allowed between ) and command-name.
generic-token-with-subexpr-start statement-list~opt~ )
command-namecommand-name-expr:
command-name
primary-expressioncommand-elements:
command-element
command-elements command-element
command-element:
command-parameter
command-argument
redirection
command-argument:
command-name-expr
verbatim-command-argument:
--% verbatim-command-argument-chars
Deskripsi:
pengalihan dibahas dalam §7.12; ekspresi penugasan dibahas dalam §7.11; dan command-invocation-operator dot (.) dibahas dalam §3.5.5. Untuk diskusi pemetaan argumen-ke-parameter dalam pemanggilan perintah, lihat §8,14.
Perintah pertama dalam alur adalah ekspresi atau pemanggilan perintah. Biasanya, pemanggilan perintah dimulai dengan nama perintah , yang biasanya merupakan pengidentifikasi kosong. elemen perintah mewakili daftar argumen ke perintah . Garis baru atau titik koma yang tidak ditandai mengakhiri alur.
Pemanggilan perintah terdiri dari nama perintah diikuti oleh argumen nol atau lebih. Aturan yang mengatur argumen adalah sebagai berikut:
Argumen yang bukan ekspresi, tetapi berisi teks arbitrer tanpa spasi putih yang tidak dilepas, diperlakukan seolah-olah dikutip ganda. Tata letak huruf dipertahankan.
Substitusi variabel dan ekspansi sub-ekspresi (
§2.3.5.2 ) berlangsung di dalamliteral-string yang dapat diperluas dan s dans.literal-string-di-sini yang dapat diperluas Teks di dalam tanda kutip memungkinkan adanya spasi kosong di awal, di akhir, dan di antara untuk disertakan dalam nilai argumen. [Catatan: Kehadiran spasi kosong dalam argumen yang dikutip tidak mengubah satu argumen menjadi beberapa argumen. catatan akhir]
Menempatkan tanda kurung di sekitar argumen menyebabkan ekspresi tersebut dievaluasi sehingga hasilnya diteruskan dan bukan teks dari ekspresi asli.
Untuk meneruskan argumen yang terlihat seperti
[switch]parameter (§2.3.4) tetapi tidak dimaksudkan seperti itu, sertakan argumen tersebut dalam tanda kutip.Saat menentukan argumen yang cocok dengan parameter yang memiliki batasan jenis
[switch](§8.10.5), kehadiran nama argumen sendiri menyebabkan parameter tersebut diatur ke$true. Namun, nilai parameter dapat diatur secara eksplisit dengan menambahkan akhiran ke argumen . Misalnya, mengingat jenis parameter yang dibatasi p, argumen-p:$truemengatur p ke True, sementara-p:$falsemengatur p ke False.Argumen
--menunjukkan bahwa semua argumen yang mengikutinya akan diteruskan dalam bentuk aslinya seolah-olah tanda kutip ganda diletakkan di sekelilingnya.Argumen
--%menunjukkan bahwa semua argumen yang mengikutinya akan diteruskan dengan penguraian dan pemrosesan minimal. Argumen ini disebut parameter verbatim. Argumen setelah parameter verbatim bukanlah ekspresi PowerShell meskipun merupakan ekspresi PowerShell yang valid secara sintaksis.
Jika jenis perintah adalah Aplikasi, parameter --% tidak diteruskan ke perintah . Argumen setelah --% memiliki variabel lingkungan apa pun (string yang dikelilingi oleh %) yang diekspansi. Misalnya:
echoargs.exe --% "%path%" # %path% is replaced with the value $Env:path
Urutan evaluasi argumen tidak ditentukan.
Untuk informasi tentang pengikatan parameter, lihat §8,14. Untuk informasi tentang pencarian nama, lihat §3,8.
Setelah pemrosesan argumen selesai, perintah dipanggil. Jika perintah yang dipanggil berakhir secara normal (§8,5,4), kontrol kembali ke titik dalam skrip atau fungsi segera setelah pemanggilan perintah. Untuk deskripsi perilaku tentang penghentian abnormal, lihat break (§8,5,1), continue (§8,5,2), throw (§8,85.3), exit (§8.5.5), try (§8.7), dan trap (§8.8).
Biasanya, perintah dipanggil dengan menggunakan namanya diikuti oleh argumen apa pun. Namun, operator pemanggilan perintah, &, dapat digunakan. Jika nama perintah berisi spasi kosong yang tidak dilewati, nama tersebut harus dikutip dan dipanggil dengan operator ini. Karena blok skrip tidak memiliki nama, blok skrip juga harus dipanggil dengan operator ini. Misalnya, pemanggilan perintah Get-Factorial berikut adalah setara:
Get-Factorial 5
& Get-Factorial 5
& "Get-Factorial" 5
Panggilan fungsi rekursif langsung dan tidak langsung diizinkan. Misalnya
function Get-Power([int]$x, [int]$y) {
if ($y -gt 0) { return $x * (Get-Power $x (--$y)) }
else { return 1 }
}
Contoh:
New-Object 'int[,]' 3,2
New-Object -ArgumentList 3,2 -TypeName 'int[,]'
dir E:\PowerShell\Scripts\*statement*.ps1 | ForEach-Object {$_.Length}
dir E:\PowerShell\Scripts\*.ps1 |
Select-String -List "catch" |
Format-Table Path, LineNumber -AutoSize
8.3 Pernyataan if
Sintaksis:
if-statement:
if new-lines~opt~ ( new-lines~opt~ pipeline new-lines~opt~ ) statement-block
elseif-clauses~opt~ else-clause~opt~
elseif-clauses:
elseif-clause
elseif-clauses elseif-clause
elseif-clause:
new-lines~opt~ elseif new-lines~opt~ ( new-lines~opt~ pipeline new-lines~opt~ ) statement-block
else-clause:
new-lines~opt~ else statement-block
Deskripsi:
Jalur ekspresi pengontrol harus berjenis bool atau dapat dikonversi secara implisit ke jenis tersebut. klausa lain bersifat opsional. Mungkin ada nol atau lebih klausa else if .
Jika alur
Contoh:
$grade = 92
if ($grade -ge 90) { "Grade A" }
elseif ($grade -ge 80) { "Grade B" }
elseif ($grade -ge 70) { "Grade C" }
elseif ($grade -ge 60) { "Grade D" }
else { "Grade F" }
8.4 Pernyataan perulangan
8.4.1 Pernyataan sementara
Sintaksis:
while-statement:
while new-lines~opt~ ( new-lines~opt~ while-condition new-lines~opt~ ) statement-block
while-condition:
new-lines~opt~ pipeline
Deskripsi:
Ekspresi pengontrol dalam kondisi 'while' harus memiliki jenis bool atau dapat dikonversi secara implisit ke jenis bool tersebut. Isi perulangan, yang terdiri dari blok pernyataan, dijalankan berulang kali sampai ekspresi kontrol menghasilkan False. Ekspresi pengontrol dievaluasi sebelum setiap eksekusi badan perulangan.
Contoh:
$i = 1
while ($i -le 5) { # loop 5 times
"{0,1}`t{1,2}" -f $i, ($i*$i)
++$i
}
8.4.2 Pernyataan do
Sintaksis:
do-statement:
do statement-block new-lines~opt~ while new-lines~opt~ ( while-condition new-lines~opt~ )
do statement-block new-lines~opt~ until new-lines~opt~ ( while-condition new-lines~opt~ )
while-condition:
new-lines~opt~ pipeline
Deskripsi:
Ekspresi pengontrol dalam kondisi 'while' harus memiliki jenis bool atau dapat dikonversi secara implisit ke jenis bool tersebut. Dalam bentuk 'while', isi loop, yang terdiri dari statement-block, dijalankan berulang kali saat ekspresi pengontrol menghasilkan nilai True. Dalam bentuk until, isi perulangan dijalankan berulang kali hingga ekspresi pengontrol menguji True. Ekspresi pengontrol dievaluasi setelah setiap eksekusi badan perulangan.
Contoh:
$i = 1
do {
"{0,1}`t{1,2}" -f $i, ($i * $i)
}
while (++$i -le 5) # loop 5 times
$i = 1
do {
"{0,1}`t{1,2}" -f $i, ($i * $i)
}
until (++$i -gt 5) # loop 5 times
8.4.3 Pernyataan for
Sintaksis:
for-statement:
for new-lines~opt~ (
new-lines~opt~ for-initializer~opt~ statement-terminator
new-lines~opt~ for-condition~opt~ statement-terminator
new-lines~opt~ for-iterator~opt~
new-lines~opt~ ) statement-block
for new-lines~opt~ (
new-lines~opt~ for-initializer~opt~ statement-terminator
new-lines~opt~ for-condition~opt~
new-lines~opt~ ) statement-block
for new-lines~opt~ (
new-lines~opt~ for-initializer~opt~
new-lines~opt~ ) statement-block
for-initializer:
pipeline
for-condition:
pipeline
for-iterator:
pipeline
Deskripsi:
Ekspresi pengontrol untuk kondisi harus memiliki jenis bool atau secara implisit dapat dikonversi ke jenis tersebut. Isi perulangan, yang terdiri dari blok pernyataan, dijalankan berulang kali saat ekspresi pengontrol menguji Benar. Ekspresi pengontrol dievaluasi sebelum setiap eksekusi badan perulangan.
Ekspresi yang digunakan untuk inisialisasi dievaluasi sebelum evaluasi pertama ekspresi pengendali. Ekspresi untuk inisialisasi dievaluasi hanya untuk efek sampingnya; nilai yang dihasilkannya diabaikan dan tidak ditulis ke pipeline.
Ekspresi for-iterator dievaluasi setelah setiap eksekusi isi perulangan. Ekspresi for-iterator dievaluasi hanya untuk efek samping; nilai apa pun yang dihasilkannya diabaikan dan tidak ditulis ke pipeline.
Jika ekspresi untuk kondisi dihilangkan, ekspresi pengontrol akan menguji sebagai Benar.
Contoh:
for ($i = 5; $i -ge 1; --$i) { # loop 5 times
"{0,1}`t{1,2}" -f $i, ($i * $i)
}
$i = 5
for (; $i -ge 1; ) { # equivalent behavior
"{0,1}`t{1,2}" -f $i, ($i * $i)
--$i
}
8.4.4 Pernyataan foreach
Sintaksis:
foreach-statement:
foreach new-lines~opt~ foreach-parameter~opt~ new-lines~opt~
( new-lines~opt~ variable new-lines~opt~ *in* new-lines~opt~ pipeline
new-lines~opt~ ) statement-block
foreach-parameter:
-parallel
Deskripsi:
Isi perulangan, yang terdiri dari blok pernyataan, dijalankan untuk setiap elemen yang ditunjuk oleh variabel variable dalam koleksi yang ditunjuk oleh pipeline. Cakupan variabel tidak terbatas pada pernyataan foreach. Dengan demikian, nilai tersebut mempertahankan nilai akhir setelah perulangan selesai dieksekusi. Jika alur menunjuk skalar (tidak termasuk nilai $null) alih-alih koleksi, skalar tersebut diperlakukan sebagai kumpulan satu elemen. Jika alur menunjuk nilai $null, alur diperlakukan sebagai kumpulan elemen nol.
Jika parameter foreach
Parameter foreach ‑parallel hanya diizinkan dalam alur kerja (§8.10.2).
Setiap pernyataan foreach memiliki enumerator sendiri, $foreach (§2.3.2.2, §4.5.16), yang hanya ada saat perulangan itu dijalankan.
Objek yang dihasilkan oleh alur dikumpulkan sebelum blok pernyataan mulai dijalankan. Namun, dengan cmdlet ForEach-Object, blok pernyataan dijalankan pada setiap objek saat setiap objek diproduksi.
Contoh:
$a = 10, 53, 16, -43
foreach ($e in $a) {
...
}
$e # the int value -43
foreach ($e in -5..5) {
...
}
foreach ($t in [byte], [int], [long]) {
$t::MaxValue # get static property
}
foreach ($f in Get-ChildItem *.txt) {
...
}
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
foreach ($e in $h1.Keys) {
"Key is " + $e + ", Value is " + $h1[$e]
}
8.5 Pernyataan pengendalian aliran
Sintaksis:
flow-control-statement:
break label-expression~opt~
continue label-expression~opt~
throw pipeline~opt~
return pipeline~opt~
exit pipeline~opt~
label-expression:
simple-name
unary-expression
Deskripsi:
Pernyataan kontrol alur menyebabkan transfer kontrol tanpa syarat ke beberapa lokasi lain.
8.5.1 Pernyataan pembobolan
Deskripsi:
Pernyataan pemutusan dengan ekspresi label disebut sebagai pernyataan pemutusan berlabel . Pernyataan pemutusan tanpa ekspresi label disebut sebagai pernyataan jeda tanpa label.
Di luar pernyataan trap, pernyataan break yang tidak berlabel langsung dalam pernyataan iterasi tersebut (§8.4) mengakhiri eksekusi pernyataan iterasi terkecil yang menyelubungi. Pernyataan pemutusan tanpa label langsung dalam pernyataan pengalihan (§8,6) mengakhiri pencocokan pola untuk kondisi switch saat ini . Lihat (§8.8) untuk detail penggunaan break dari dalam pernyataan trap.
Pernyataan perulangan atau pernyataan pengalihan dapat secara opsional didahului segera oleh satu label pernyataan (§8.1.1). Label pernyataan seperti itu dapat digunakan sebagai target pernyataan jeda berlabel, dalam hal ini, pernyataan tersebut mengakhiri eksekusi pernyataan iterasi penutup yang ditargetkan.
Pemutusan berlabel tidak perlu dipecahkan dalam cakupan lokal apa pun; pencarian label yang cocok dapat melanjutkan naik tumpukan panggilan bahkan melewati batas skrip dan panggilan fungsi. Jika tidak ada label yang cocok yang ditemukan, pemanggilan perintah saat ini akan dihentikan.
Nama label yang ditunjuk oleh label-expression tidak perlu memiliki nilai konstanta.
Jika ekspresi label
Contoh:
$i = 1
while ($true) { # infinite loop
if ($i * $i -gt 100) {
break # break out of current while loop
}
++$i
}
$lab = "go_here"
:go_here
for ($i = 1; ; ++$i) {
if ($i * $i -gt 50) {
break $lab # use a string value as target
}
}
:labelA
for ($i = 1; $i -le 2; $i++) {
:labelB
for ($j = 1; $j -le 2; $j++) {
:labelC
for ($k = 1; $k -le 3; $k++) {
if (...) { break labelA }
}
}
}
8.5.2 Pernyataan lanjutan
Deskripsi:
Pernyataan continue dengan ekspresi label disebut sebagai pernyataan 'continue' berlabel . Pernyataan lanjutan tanpa ekspresi label disebut sebagai pernyataan lanjutan tanpa label .
Penggunaan continue dari dalam pernyataan jebakan dibahas dalam §8.8.
Pernyataan continue yang tidak berlabel dalam perulangan mengakhiri eksekusi perulangan saat ini dan mentransfer kontrol ke kurung penutup dari pernyataan iterasi terkecil yang menutup (§8.4). Pernyataan
Pernyataan iterasi atau pernyataan switch (§8,6) dapat secara opsional didahului oleh satu label pernyataan (§8.1.1). Label pernyataan tersebut dapat digunakan sebagai target dari sebuah pernyataan berlabel yang terlampir continue. Dalam situasi ini, pernyataan tersebut mengakhiri eksekusi dari loop atau iterasi switch saat ini, dan mengalihkan kendali ke iterasi atau label pernyataan switch yang ditargetkan.
continue tidak perlu diselesaikan dalam cakupan lokal mana pun; pencarian label yang cocok dapat continue ke atas di sepanjang panggilan stack bahkan melintasi batas skrip dan panggilan fungsi. Jika tidak ada label yang cocok yang ditemukan, pemanggilan perintah saat ini akan dihentikan.
Nama label yang ditunjuk oleh label-expression tidak perlu memiliki nilai konstanta.
Jika ekspresi label
Contoh:
$i = 1
while (...) {
...
if (...) {
continue # start next iteration of current loop
}
...
}
$lab = "go_here"
:go_here
for (...; ...; ...) {
if (...) {
continue $lab # start next iteration of labeled loop
}
}
:labelA
for ($i = 1; $i -le 2; $i++) {
:labelB
for ($j = 1; $j -le 2; $j++) {
:labelC
for ($k = 1; $k -le 3; $k++) {
if (...) { continue labelB }
}
}
}
8.5.3 Pernyataan pelemparan
Deskripsi:
Pengecualian adalah cara menangani kondisi kesalahan tingkat sistem atau aplikasi. Pernyataan lemparan menimbulkan pengecualian. (Lihat §8,7 untuk diskusi penanganan pengecualian.)
Jika alur
Jika alur ada, jenis pengecualian yang dilemparkan ditentukan oleh implementasi.
Ketika suatu pengecualian dilempar, kendali dialihkan ke klausa tangkapan pertama dalam pernyataan try yang dapat menangani pengecualian tersebut. Lokasi di mana pengecualian awalnya dilemparkan disebut titik lempar . Setelah pengecualian dilemparkan langkah-langkah yang dijelaskan dalam §8,7 diikuti berulang kali sampai klausul tangkapan yang cocok dengan pengecualian ditemukan atau tidak ada yang dapat ditemukan.
Contoh:
throw
throw 100
throw "No such record in file"
Jika pipeline dihilangkan dan pernyataan lemparan bukan dari dalam klausul tangkapan, teks "ScriptHalted" ditulis ke pipeline, dan jenis pengecualian yang dimunculkan adalah System.Management.Automation.RuntimeException.
Jika pipeline ada, pengecualian yang terjadi dibungkus dalam objek jenis System.Management.Automation.RuntimeException, yang mencakup informasi tentang pengecualian sebagai objek System.Management.Automation.ErrorRecord (dapat diakses melalui $_).
Contoh 1: throw 123 menghasilkan pengecualian jenis RuntimeException. Dari dalam blok tangkapan, $_.TargetObject berisi objek yang dibungkus di dalamnya, dalam hal ini, System.Int32 dengan nilai 123.
Contoh 2: throw "xxx" menghasilkan pengecualian jenis RuntimeException. Dari dalam blok tangkapan, $_.TargetObject berisi objek yang dibungkus di dalamnya, dalam hal ini, System.String dengan nilai "xxx".
Contoh 3: throw 10,20 menghasilkan pengecualian jenis RuntimeException. Dari dalam blok tangkapan, $_.TargetObject berisi objek yang dibungkus di dalamnya, dalam hal ini, System.Object[], array tak terbatas dengan dua elemen yang berisi nilai System.Int32` 10 dan 20.
8.5.4 Pernyataan pengembalian
Deskripsi:
Pernyataan return menulis ke pipeline nilai yang ditunjuk oleh pipeline, jika ada, dan mengembalikan kontrol ke pemanggil fungsi atau skrip. Fungsi atau skrip mungkin memiliki nol atau lebih pernyataan return.
Jika eksekusi mencapai kurung kurawal penutup fungsi, return yang tersirat diasumsikan tanpa adanya alur .
Pernyataan return adalah sedikit "gula sintaksis" untuk memungkinkan programmer mengekspresikan diri mereka seperti yang mereka bisa dalam bahasa lain; namun, nilai yang dikembalikan dari fungsi atau skrip sebenarnya adalah semua nilai yang ditulis ke pipeline oleh fungsi atau skrip tersebut ditambah nilai apa pun yang ditentukan oleh pipeline . Jika hanya nilai skalar yang ditulis ke alur data, jenisnya adalah jenis nilai yang dikembalikan; jika tidak, jenis pengembaliannya adalah array 1 dimensi yang tidak memiliki batasan yang berisi semua nilai yang ditulis ke alur data.
Contoh:
function Get-Factorial ($v) {
if ($v -eq 1) {
return 1 # return is not optional
}
return $v * (Get-Factorial ($v - 1)) # return is optional
}
Pemanggil untuk Get-Factorial menerima int.
function Test {
"text1" # "text1" is written to the pipeline
# ...
"text2" # "text2" is written to the pipeline
# ...
return 123 # 123 is written to the pipeline
}
Pemanggil untuk Test mendapatkan kembali array satu dimensi tak terbatas yang terdiri dari tiga elemen.
8.5.5 Pernyataan keluar
Deskripsi:
Pernyataan keluar mengakhiri skrip saat ini dan mengembalikan kontrol dan kode keluar ke lingkungan host atau skrip panggilan. Jika pipeline disediakan, nilai yang ditunjuknya dikonversi ke int, jika perlu. Jika tidak ada konversi seperti itu, atau jika alur dihilangkan, nilai int nol dikembalikan.
Contoh:
exit $count # terminate the script with some accumulated count
8.6 Pernyataan pengalihan
Sintaksis:
switch-statement:
switch new-lines~opt~ switch-parameters~opt~ switch-condition switch-body
switch-parameters:
switch-parameter
switch-parameters switch-parameter
switch-parameter:
-Regex
-Wildcard
-Exact
-CaseSensitive
-Parallel
switch-condition:
( new-lines~opt~ pipeline new-lines~opt~ )
-File new-lines~opt~ switch-filename
switch-filename:
command-argument
primary-expression
switch-body:
new-lines~opt~ { new-lines~opt~ switch-clauses }
switch-clauses:
switch-clause
switch-clauses switch-clause
switch-clause:
switch-clause-condition statement-block statement-terimators~opt~
switch-clause-condition:
command-argument
primary-expression
Deskripsi:
Jika kondisi pengalihan menunjuk satu nilai, kontrol diteruskan ke satu atau beberapa blok pernyataan pola yang cocok. Jika tidak ada pola yang cocok, beberapa tindakan default dapat diambil.
Sakelar harus berisi satu atau lebih klausa sakelar , masing-masing dimulai dengan pola (klausa sakelar non-default ), atau dengan kata kunci default (klausa sakelar default ). Sakelar harus berisi nol atau satu klausa sakelar default, dan nol atau lebih klausa sakelar selain default. Klausa switch dapat ditulis dalam urutan apa pun.
Beberapa pola mungkin memiliki nilai yang sama. Pola tidak perlu harfiah, dan sakelar mungkin memiliki pola dengan jenis yang berbeda.
Jika nilai kondisi sakelar cocok dengan nilai pola, blok pernyataan pola tersebut dijalankan. Jika beberapa nilai pola cocok dengan nilai kondisi sakelar, setiap blok pernyataan dari pola yang cocok dijalankan, dalam urutan leksikal, kecuali salah satu dari blok pernyataan tersebut berisi pernyataan break (§8.5.1).
Jika nilai kondisi sakelar tidak cocok dengan nilai pola apa pun, jika ada default klausa sakelar, blok pernyataannya dijalankan; jika tidak, pencocokan pola untuk kondisi sakelar dihentikan.
Sakelar dapat ditumpuk, dengan setiap sakelar memiliki sekumpulan klausul pengalihannya sendiri. Dalam kasus seperti itu, pernyataan switch termasuk dalam switch terdekat yang cakupannya sedang aktif saat ini.
Pada saat memasuki setiap blok pernyataan $_ tersedia juga dalam blok pernyataankondisi-klausul-switch.
Pencocokan non-string dilakukan dengan menguji kesetaraan (§7.8.1).
Jika pencocokan melibatkan string, secara default, perbandingannya tidak peka terhadap huruf besar-kecil. Kehadiran parameter sakelar -CaseSensitive membuat perbandingan bersifat peka huruf besar/kecil.
Pola mungkin berisi karakter kartu bebas (§3.15), dalam hal ini, perbandingan string kartu bebas dilakukan, tetapi hanya jika parameter pengubah-Wildcard ada. Secara bawaan, perbandingannya tidak sensitif terhadap huruf besar/kecil.
Sebuah pola dapat berisi ekspresi reguler (§3,16), yang dalam hal ini, perbandingan string ekspresi reguler dilakukan, tetapi hanya jika parameter saklar -Regex ada. Secara bawaan, perbandingannya tidak sensitif terhadap huruf besar/kecil. Jika -Regex ada dan pola sesuai, $Matches didefinisikan dalam switch-clausestatement-block untuk pola tersebut.
switch-parameter dapat disingkat; setiap bagian awal yang berbeda dari sebuah parameter dapat digunakan. Misalnya, ‑Regex, ‑Rege, ‑Reg, ‑Re, dan ‑R setara.
Jika switch-parameter‑Exact menonaktifkan -Regex dan -Wildcard; namun tidak berpengaruh pada ‑Case.
Jika parameter sakelar ‑Parallel ditentukan, perilakunya bergantung pada implementasi.
Parameter sakelar‑Parallel hanya diizinkan dalam alur kerja (§8.10.2).
Jika pola adalah script-block-expression, blok tersebut dievaluasi dan hasilnya dikonversi ke bool, jika perlu. Jika hasilnya memiliki nilai $true, blok pernyataan yang sesuai dijalankan; jika tidak, maka tidak dijalankan.
Jika kondisi pengalihan memberikan beberapa nilai, kondisi pengalihan diterapkan ke setiap nilai dalam urutan leksikal menggunakan aturan yang dijelaskan di atas untuk kondisi pengalihan yang memberikan satu nilai. Setiap pernyataan switch memiliki enumerator sendiri, $switch (§2.3.2.2, §4.5.16), yang hanya ada saat sakelar itu dijalankan.
Pernyataan 'switch' mungkin memiliki label, dan mungkin berisi pernyataan berlabel dan tidak berlabel termasuk pernyataan 'break' (§8.5.1) dan pernyataan 'lanjut' (§8.5.2).
Jika kondisi sakelar-Fileswitch-filename, alih-alih melakukan iterasi pada nilai dalam ekspresi, sakelar melakukan iterasi melalui nilai-nilai dalam file yang ditunjuk oleh switch-filename. File dibaca satu baris pada satu waktu, di mana setiap baris terdiri dari suatu nilai. Karakter pemisah baris tidak disertakan dalam nilai.
Contoh:
$s = "ABC def`nghi`tjkl`fmno @#$"
$charCount = 0; $pageCount = 0; $lineCount = 0; $otherCount = 0
for ($i = 0; $i -lt $s.Length; ++$i) {
++$charCount
switch ($s[$i]) {
"`n" { ++$lineCount }
"`f" { ++$pageCount }
"`t" { }
" " { }
default { ++$otherCount }
}
}
switch -Wildcard ("abc") {
a* { "a*, $_" }
?B? { "?B? , $_" }
default { "default, $_" }
}
switch -Regex -CaseSensitive ("abc") {
^a* { "a*" }
^A* { "A*" }
}
switch (0, 1, 19, 20, 21) {
{ $_ -lt 20 } { "-lt 20" }
{ $_ -band 1 } { "Odd" }
{ $_ -eq 19 } { "-eq 19" }
default { "default" }
}
8.7 Pernyataan try/finally
Sintaksis:
try-statement:
try statement-block catch-clauses
try statement-block finally-clause
try statement-block catch-clauses finally-clause
catch-clauses:
catch-clause
catch-clauses catch-clause
catch-clause:
new-lines~opt~ catch catch-type-list~opt~
statement-block
catch-type-list:
new-lines~opt~ type-literal
catch-type-list new-lines~opt~ , new-lines~opt~
type-literalfinally-clause:
new-lines~opt~ finally statement-block
Deskripsi:
Pernyataan try menyediakan mekanisme untuk menangkap pengecualian yang terjadi selama eksekusi suatu blok. Pernyataan coba juga menyediakan kemampuan untuk menentukan blok kode yang selalu dijalankan ketika kontrol meninggalkan pernyataan coba. Proses melempar pengecualian dengan pernyataan throw dijelaskan dalam §8.5.3.
blok coba adalah blok pernyataan yang terkait dengan pernyataan coba. Blok penanganan pengecualian
Klausul tangkapan
Setiap klausul tangkap adalah penangan pengecualian, dan klausul tangkap yang daftar jenis tangkapannya berisi jenis pengecualian yang terjadi disebut klausul tangkap yang cocok. Klausa penanganan kesalahan umum cocok dengan semua jenis pengecualian.
Meskipun klausul tangkapan dan klausul akhirnya bersifat opsional, setidaknya salah satunya harus ada.
Pemrosesan pengecualian yang dilemparkan terdiri dari mengevaluasi langkah-langkah berikut berulang kali sampai klausa tangkapan yang cocok dengan pengecualian ditemukan.
Dalam cakupan saat ini, setiap pernyataan try yang mencakup titik lempar diperiksa. Untuk setiap pernyataan percobaan S, dimulai dengan pernyataan coba terdahulu dan diakhiri dengan pernyataan coba terluar, langkah-langkah berikut dievaluasi:
Jika blok
tryS mencakup titik lemparan dan jika S memiliki satu atau beberapa klausa tangkapan, klausa tangkapan diperiksa dalam urutan leksikal untuk menemukan handler yang sesuai untuk pengecualian. Klausa tangkapan pertama yang menentukan jenis pengecualian atau jenis dasar dari jenis pengecualian dianggap cocok. Klausul penanganan umum dianggap cocok untuk jenis pengecualian apa pun. Jika klausul tangkapan yang cocok ditemukan, pemrosesan pengecualian diselesaikan dengan mentransfer kontrol ke blok klausa tangkapan tersebut. Dalam klausa tangkapan yang sesuai, variabel$_berisi deskripsi pengecualian saat ini.Jika tidak, jika blok
tryatau blokcatchS menutupi titik lemparan dan jika S memiliki blokfinally, kontrol ditransfer ke blok akhirnya. Jika blokfinallymelemparkan pengecualian lain, pemrosesan pengecualian saat ini dihentikan. Jika tidak, ketika kontrol mencapai akhir blokfinally, pemrosesan pengecualian saat ini dilanjutkan.
Jika penangan pengecualian tidak ditemukan di cakupan saat ini, langkah-langkah di atas kemudian diulang untuk cakupan yang melingkupinya dengan titik lempar yang sesuai dengan pernyataan dari mana cakupan saat ini dipanggil.
Jika pemrosesan pengecualian akhirnya mengakhiri semua cakupan, menunjukkan bahwa tidak ada handler yang ada untuk pengecualian, maka perilaku tersebut tidak ditentukan.
Untuk mencegah klausul tangkapan yang tidak dapat dijangkau dalam blok percobaan, klausa tangkapan mungkin tidak menentukan jenis pengecualian yang sama dengan atau berasal dari jenis yang ditentukan dalam klausa tangkapan sebelumnya dalam blok percobaan yang sama.
Pernyataan blok finally selalu dijalankan ketika kontrol meninggalkan pernyataan try. Ini benar apakah transfer kontrol terjadi sebagai akibat dari eksekusi normal, sebagai akibat dari menjalankan pernyataan break, continue, atau return, atau sebagai akibat dari pengecualian yang dikeluarkan dari pernyataan try.
Jika pengecualian dilemparkan selama eksekusi blok finally, pengecualian dipindahkan ke pernyataan try yang membungkus berikutnya. Jika pengecualian lain sedang dalam proses ditangani, pengecualian tersebut hilang. Proses pembuatan pengecualian dibahas lebih lanjut dalam deskripsi pernyataan throw.
pernyataan try dapat bersama dengan pernyataan trap; lihat §8,8 untuk detailnya.
Contoh:
$a = New-Object 'int[]' 10
$i = 20 # out-of-bounds subscript
while ($true) {
try {
$a[$i] = 10
"Assignment completed without error"
break
}
catch [IndexOutOfRangeException] {
"Handling out-of-bounds index, >$_<`n"
$i = 5
}
catch {
"Caught unexpected exception"
}
finally {
# ...
}
}
Setiap pengecualian yang terjadi dinaikkan sebagai System.Management.Automation.RuntimeException. Jika ada klausa tangkapan khusus jenis di blok try, properti InnerException pengecualian diperiksa untuk menemukan kecocokan, seperti dengan jenis System.IndexOutOfRangeException di atas.
8.8 Pernyataan perangkap
Sintaksis:
trap-statement:
*trap* new-lines~opt~ type-literal~opt~ new-lines~opt~ statement-block
Deskripsi:
Pernyataan trap dengan dan tanpa tipe-literal mirip dengan blok catch (§8.7) dengan dan tanpa daftar jenis tangkapan , masing-masing, kecuali bahwa pernyataan trap hanya dapat menangkap satu jenis sekaligus.
Beberapa pernyataan trap dengan jenis harfiah yang sama didefinisikan dalam cakupan yang sama, yang pertama dalam urutan leksikal digunakan untuk memproses pengecualian dengan jenis yang cocok.
Tidak seperti blok catch, pernyataan trap cocok dengan jenis pengecualian dengan tepat; tidak ada pencocokan jenis turunan yang dilakukan.
Ketika pengecualian terjadi, jika tidak ada pernyataan trap yang cocok dalam cakupan saat ini, maka pernyataan perangkap yang cocok akan dicari dalam cakupan luar. Ini mungkin melibatkan pencarian dalam skrip yang memanggil, fungsi, atau filter, lalu dalam pemanggilnya, dan seterusnya. Jika pencarian akhirnya menghentikan semua cakupan, menunjukkan bahwa tidak ada handler untuk pengecualian, maka perilakunya tidak ditentukan.
Pernyataan trap dengan statement-body hanya dijalankan untuk memproses pengecualian yang sesuai; jika tidak, eksekusi akan melewatinya.
Jika tubuh pernyataan trap keluar secara normal, secara default, objek kesalahan ditulis ke aliran kesalahan, pengecualian dianggap telah ditangani, dan eksekusi dilanjutkan dengan pernyataan yang mengikuti langsung setelah pernyataan dalam cakupan yang berisi pernyataan yang membuat pengecualian terlihat. Penyebab pengecualian mungkin ada dalam perintah yang dipanggil oleh perintah yang berisi pernyataan trap.
Jika pernyataan akhir dieksekusi dalam trappernyataan-body adalah continue (§8.5.2), penulisan objek kesalahan ke aliran kesalahan ditekan, dan eksekusi berlanjut dengan pernyataan yang segera mengikuti dalam cakupan yang berisi pernyataan perangkap yang membuat pengecualian terlihat. Jika pernyataan terakhir yang dijalankan dalam trapbadan pernyataan adalah break (§8.5.1), maka penulisan objek kesalahan ke aliran kesalahan tidak dilakukan, dan pengecualian dilemparkan kembali.
Dalam pernyataan trap variabel $_ berisi deskripsi kesalahan saat ini.
Pertimbangkan kasus di mana pengecualian yang dimunculkan dari dalam blok try tidak memiliki blok catch yang cocok, tetapi pernyataan trap yang cocok ada pada tingkat blok yang lebih tinggi. Setelah klausa `finally` pada blok try dijalankan, pernyataan trap mengambil alih kontrol bahkan jika ada ruang lingkup induk yang memiliki blok catch yang cocok. Jika pernyataan trap didefinisikan dalam blok try itu sendiri, dan blok try memiliki blok catch yang cocok, pernyataan trap mendapatkan kontrol.
Contoh:
Dalam contoh berikut, objek kesalahan dicatat dan eksekusi berlanjut dengan pernyataan tepat setelah yang menyebabkan kesalahan; dengan kata lain, "Selesai" dikirim ke pipeline.
$j = 0; $v = 10/$j; "Done"
trap { $j = 2 }
Dalam contoh berikut, penulisan objek kesalahan dibatalkan dan eksekusi berlanjut dengan pernyataan segera setelah yang menyebabkan kesalahan; artinya, "Selesai" ditulis ke saluran.
$j = 0; $v = 10/$j; "Done"
trap { $j = 2; continue }
Dalam contoh berikut, penulisan objek kesalahan dihilangkan dan pengecualian tersebut dilempar ulang.
$j = 0; $v = 10/$j; "Done"
trap { $j = 2; break }
Dalam contoh berikut, pernyataan perangkap dan pembuatan pengecualian berada dalam cakupan yang sama. Setelah pengecualian tertangkap dan ditangani, eksekusi dilanjutkan dengan menulis 1 ke dalam alur.
&{trap{}; throw '\...'; 1}
Dalam contoh berikut, pernyataan perangkap dan pembuatan pengecualian berada dalam cakupan yang berbeda. Setelah pengecualian ditangkap dan ditangani, proses dilanjutkan dengan menulis 2 (bukan 1) ke alur kerja.
trap{} &{throw '\...'; 1}; 2
8.9 Pernyataan data
Sintaksis:
data-statement:
data new-lines~opt~ data-name data-commands-allowed~opt~ statement-block
data-name:
simple-name
data-commands-allowed:
new-lines~opt~ -SupportedCommand data-commands-list
data-commands-list:
new-lines~opt~ data-command
data-commands-list , new-lines~opt~ data-command
data-command:
command-name-expr
Deskripsi:
Pernyataan data membuat bagian data dan, memastikan data pada bagian tersebut terpisah dari kode. Pemisahan ini mendukung fasilitas seperti file sumber daya string terpisah untuk teks, seperti pesan kesalahan dan string Bantuan. Ini juga membantu mendukung internasionalisasi dengan memudahkan untuk mengisolasi, menemukan, dan memproses string yang akan diterjemahkan ke dalam berbagai bahasa.
Skrip atau fungsi dapat memiliki nol atau beberapa bagian data.
Blok pernyataan dari bagian data hanya dibatasi untuk memuat fitur PowerShell berikut:
- Semua operator kecuali
-match - Pernyataan
if - Variabel otomatis berikut:
$PSCulture,$PSUICulture,$true,$false, dan$null. - Komentar
- Jalur Pipa
- Pernyataan dipisahkan oleh titik koma (
;) - Literal
- Panggilan ke cmdlet ConvertFrom-StringData
- Cmdlet lain yang diidentifikasi melalui parameter SupportedCommand
Jika cmdlet ConvertFrom-StringData digunakan, pasangan kunci/nilai dapat diekspresikan menggunakan segala bentuk string literal. Namun, literal string yang dapat diperluas dan literal here-string yang dapat diperluas tidak boleh berisi substitusi variabel atau ekspansi sub-ekspresi apa pun.
Contoh:
Parameter SupportedCommand menunjukkan bahwa cmdlet atau fungsi yang diberikan hanya menghasilkan data.
Misalnya, bagian data berikut menyertakan cmdlet yang ditulis pengguna, ConvertTo-Xml, yang memformat data dalam file XML:
data -SupportedCommand ConvertTo-Xml {
Format-Xml -Strings string1, string2, string3
}
Pertimbangkan contoh berikut, di mana bagian data berisi perintah ConvertFrom-StringData yang mengonversi string menjadi tabel hash, yang nilainya ditetapkan ke $messages.
$messages = data {
ConvertFrom-StringData -StringData @'
Greeting = Hello
Yes = yes
No = no
'@
}
Kunci dan nilai tabel hash diakses menggunakan $messages.Greeting, $messages.Yes, dan $messages.No, masing-masing.
Sekarang, ini dapat disimpan sebagai sumber daya berbahasa Inggris. Sumber daya bahasa Jerman dan Spanyol dapat dibuat dalam file terpisah, dengan bagian data berikut:
$messages = data {
ConvertFrom-StringData -StringData @"
Greeting = Guten Tag
Yes = ja
No = nein
"@
}
$messagesS = data {
ConvertFrom-StringData -StringData @"
Greeting = Buenos días
Yes = sí
No = no
"@
}
Jika dataname ada, dataname tersebut menamai variabel (tanpa menggunakan $sebagai awalan) di mana nilai pernyataan data akan disimpan. Secara khusus, $name = data { ... } setara dengan data name { ... }.
8.10 Definisi fungsi
Sintaksis:
function-statement:
function new-lines~opt~ function-name function-parameter-declaration~opt~ { script-block }
filter new-lines~opt~ function-name function-parameter-declaration~opt~ { script-block }
workflow new-lines~opt~ function-name function-parameter-declaration~opt~ { script-block }
function-name:
command-argument
command-argument:
command-name-expr
function-parameter-declaration:
new-lines~opt~ ( parameter-list new-lines~opt~ )
parameter-list:
script-parameter
parameter-list new-lines~opt~ , script-parameter
script-parameter:
new-lines~opt~ attribute-list~opt~ new-lines~opt~ variable script-parameter-default~opt~
script-block:
param-block~opt~ statement-terminators~opt~ script-block-body~opt~
param-block:
new-lines~opt~ attribute-list~opt~ new-lines~opt~ param new-lines~opt~
( parameter-list~opt~ new-lines~opt~ )
parameter-list:
script-parameter
parameter-list new-lines~opt~ , script-parameter
script-parameter-default:
new-lines~opt~ = new-lines~opt~ expression
script-block-body:
named-block-list
statement-list
named-block-list:
named-block
named-block-list named-block
named-block:
block-name statement-block statement-terminators~opt~
block-name: one of
dynamicparam begin process end
Deskripsi:
Definisi fungsi menentukan nama fungsi, filter, atau alur kerja yang ditentukan dan nama parameternya, jika ada. Ini juga berisi nol atau lebih pernyataan yang dijalankan untuk mencapai tujuan fungsi tersebut.
Setiap fungsi adalah instans kelas System.Management.Automation.FunctionInfo.
8.10.1 Fungsi filter
Sedangkan fungsi biasa berjalan sekali dalam alur dan mengakses koleksi input melalui $input, filter adalah jenis fungsi khusus yang dijalankan sekali untuk setiap objek dalam koleksi input.
Objek yang saat ini sedang diproses tersedia melalui variabel $_.
Filter tanpa blok bernama (§8.10.7) setara dengan fungsi dengan blok proses, tetapi tanpa blok awal atau blok akhir.
Pertimbangkan definisi fungsi filter dan panggilan berikut:
filter Get-Square2 { # make the function a filter
$_ * $_ # access current object from the collection
}
-3..3 | Get-Square2 # collection has 7 elements
6, 10, -3 | Get-Square2 # collection has 3 elements
Setiap filter adalah instans dari kelas System.Management.Automation.FilterInfo (§4.5.11).
8.10.2 Fungsi alur kerja
Fungsi alur kerja seperti fungsi biasa dengan semantik yang ditentukan implementasi. Fungsi alur kerja diterjemahkan ke urutan aktivitas Windows Workflow Foundation dan dijalankan di mesin Windows Workflow Foundation.
8.10.3 Pemrosesan argumen
Pertimbangkan definisi berikut untuk fungsi yang disebut Get-Power:
function Get-Power ([long]$Base, [int]$Exponent) {
$result = 1
for ($i = 1; $i -le $Exponent; ++$i) {
$result *= $Base
}
return $result
}
Fungsi ini memiliki dua parameter, $Base dan $Exponent. Ini juga berisi serangkaian pernyataan yang, untuk nilai eksponen non-negatif, menghitung $Base^$Exponent^ dan mengembalikan hasilnya ke pemanggil Get-Power.
Saat skrip, fungsi, atau filter memulai eksekusi, setiap parameter diinisialisasi ke nilai argumen yang sesuai. Jika tidak ada argumen yang sesuai dan nilai default (§8.10.4) disediakan, nilai tersebut digunakan; jika tidak, nilai $null digunakan. Dengan demikian, setiap parameter adalah variabel baru sama seperti jika diinisialisasi oleh penugasan di awal script-block.
Jika parameter skrip berisi batasan jenis (seperti [long] dan [int] di atas), nilai argumen yang sesuai dikonversi ke jenis tersebut, jika perlu; jika tidak, tidak ada konversi yang terjadi.
Saat skrip, fungsi, atau filter memulai eksekusi, variabel $args didefinisikan di dalamnya sebagai array 1 dimensi yang tidak dibatasi, yang berisi semua argumen yang tidak terikat oleh nama atau posisi, dalam urutan leksikal.
Pertimbangkan definisi fungsi dan panggilan berikut:
function F ($a, $b, $c, $d) { ... }
F -b 3 -d 5 2 4 # $a is 2, $b is 3, $c is 4, $d is 5, $args Length 0
F -a 2 -d 3 4 5 # $a is 2, $b is 4, $c is 5, $d is 3, $args Length 0
F 2 3 4 5 -c 7 -a 1 # $a is 1, $b is 2, $c is 7, $d is 3, $args Length 2
Untuk informasi selengkapnya tentang pengikatan parameter, lihat §8.14.
8.10.4 Penginisialisasi parameter
Deklarasi parameter p mungkin berisi penginisialisasi, dalam hal ini, nilai penginisialisasi digunakan untuk menginisialisasi p asalkan p tidak terikat dengan argumen apa pun dalam panggilan.
Pertimbangkan definisi fungsi dan panggilan berikut:
function Find-Str ([string]$Str, [int]$StartPos = 0) { ... }
Find-Str "abcabc" # 2nd argument omitted, 0 used for $StartPos
Find-Str "abcabc" 2 # 2nd argument present, so it is used for $StartPos
8.10.5 Pembatasan tipe [switch]
[switch] Ketika parameter diteruskan, parameter yang sesuai dalam perintah harus dibatasi oleh sakelar jenis. Pengalih tipe memiliki dua nilai, True dan False.
Pertimbangkan definisi fungsi dan panggilan berikut:
function Process ([switch]$Trace, $P1, $P2) { ... }
Process 10 20 # $Trace is False, $P1 is 10, $P2 is 20
Process 10 -Trace 20 # $Trace is True, $P1 is 10, $P2 is 20
Process 10 20 -Trace # $Trace is True, $P1 is 10, $P2 is 20
Process 10 20 -Trace:$false # $Trace is False, $P1 is 10, $P2 is 20
Process 10 20 -Trace:$true # $Trace is True, $P1 is 10, $P2 is 20
8.10.6 Alur dan fungsi
Saat skrip, fungsi, atau filter digunakan dalam alur, kumpulan nilai dikirimkan ke skrip atau fungsi tersebut. Skrip, fungsi, atau filter mendapatkan akses ke koleksi tersebut melalui enumerator $input (§2.3.2.2, §4.5.16), yang didefinisikan pada entri ke skrip, fungsi, atau filter tersebut.
Pertimbangkan definisi fungsi dan panggilan berikut:
function Get-Square1 {
foreach ($i in $input) { # iterate over the collection
$i * $i
}
}
-3..3 | Get-Square1 # collection has 7 elements
6, 10, -3 | Get-Square1 # collection has 3 elements
8.10.7 Blok bernama
Pernyataan dalam blok skrip dapat termasuk dalam satu blok besar tanpa nama, atau dapat didistribusikan ke dalam satu atau beberapa blok bernama. Blok dengan nama memungkinkan pemrosesan secara kustom koleksi yang berasal dari pipeline; blok dengan nama dapat didefinisikan dalam urutan apa pun.
Pernyataan dalam blok begin (yaitu, yang ditandai dengan kata kunci begin) dijalankan sekali, sebelum objek pipeline pertama disampaikan.
Pernyataan dalam blok proses (yaitu, yang ditandai dengan kata kunci 'process') dieksekusi untuk setiap objek jalur yang dikirimkan. ($_ menyediakan akses ke objek saat ini yang sedang diproses dari koleksi input yang berasal dari alur.) Ini berarti bahwa jika kumpulan elemen nol dikirim melalui alur, blok proses tidak dijalankan sama sekali. Namun, jika skrip atau fungsi dipanggil di luar konteks alur, blok ini dijalankan tepat sekali, dan $_ diatur ke $null, karena tidak ada objek koleksi saat ini.
Pernyataan dalam blok akhir (yaitu; satu yang ditandai dengan kata kunci 'end') dijalankan sekali, setelah objek pipeline terakhir disampaikan.
8.10.8 blok dynamicparam
Subbagian §8,10 sejauh ini menangani parameter statis , yang didefinisikan sebagai bagian dari kode sumber. Dimungkinkan juga untuk menentukan parameter dinamis melalui blok dynamicparam , bentuk lain dari blok bernama (§8,10,7), yang ditandai dengan kata kunci dynamicparam. Sebagian besar sistem ini ditentukan oleh implementasi.
Parameter dinamis adalah parameter cmdlet, fungsi, filter, atau skrip yang hanya tersedia dalam kondisi tertentu. Salah satu contohnya adalah parameter Pengodean .
Dalamblok pernyataan New-Object untuk membuat objek dari jenis yang ditentukan implementasi yang berbeda untuk mewakili atribut parameter yang ditentukan implementasi.
Contoh berikut menunjukkan fungsi dengan parameter standar yang disebut Nama dan Jalur, dan parameter dinamis opsional bernama DP1. Parameter DP1 merupakan bagian dari set parameter PSet1 dan memiliki jenis Int32. Parameter DP1 tersedia dalam fungsi Sampel hanya ketika nilai parameter Path berisi "HKLM:", menunjukkan bahwa parameter tersebut digunakan dalam drive registri HKEY_LOCAL_MACHINE.
function Sample {
param ([string]$Name, [string]$Path)
dynamicparam {
if ($Path -match "*HKLM*:") {
$dynParam1 = New-Object System.Management.Automation.RuntimeDefinedParameter("dp1", [int32], $attributeCollection)
$attributes = New-Object System.Management.Automation.ParameterAttribute
$attributes.ParameterSetName = 'pset1'
$attributes.Mandatory = $false
$attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection``1[System.Attribute]
$attributeCollection.Add($attributes)
$paramDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
$paramDictionary.Add("dp1", $dynParam1)
return $paramDictionary
}
}
}
Jenis yang digunakan untuk membuat objek untuk mewakili parameter dinamis System.Management.Automation.RuntimeDefinedParameter.
Jenis yang digunakan untuk membuat objek untuk mewakili atribut parameter adalah System.Management.Automation.ParameterAttribute.
Atribut parameter yang ditentukan implementasi termasuk Wajib, Posisi, dan ValueFromPipeline.
8.10.9 blok param
Sebuah param-block menyediakan cara alternatif untuk mendeklarasikan parameter. Misalnya, sekumpulan deklarasi parameter berikut adalah setara:
function FindStr1 ([string]$Str, [int]$StartPos = 0) { ... }
function FindStr2 {
param ([string]$Str, [int]$StartPos = 0) ...
}
param-block memungkinkan daftar atribut pada param-block, sedangkan deklarasi parameter fungsi tidak.
Skrip mungkin memiliki blok parameter tetapi tidak memiliki deklarasi parameter fungsi. Definisi fungsi atau filter dapat memiliki deklarasi parameter fungsi (function-parameter-declaration) atau blok parameter (param-block), tetapi tidak keduanya.
Pertimbangkan contoh berikut:
param ( [Parameter(Mandatory = $true, ValueFromPipeline=$true)]
[string[]] $ComputerName )
Satu parameter, $ComputerName, memiliki jenis string[], diperlukan, dan dibutuhkan input dari alur.
Lihat §12.3.7 untuk diskusi atribut Parameter dan untuk contoh selengkapnya.
8.11 Pernyataan paralel
Sintaksis:
parallel-statement:
*parallel* statement-block
Pernyataan paralel berisi nol atau lebih pernyataan yang dijalankan dengan cara yang ditentukan implementasi.
Pernyataan paralel hanya diizinkan dalam alur kerja (§8.10.2).
8.12 Pernyataan berurutan
Sintaksis:
sequence-statement:
*sequence* statement-block
Urutan pernyataan berisi nol atau lebih pernyataan yang dijalankan dengan cara yang ditentukan oleh implementasi.
Pernyataan urutan hanya diperbolehkan dalam alur kerja (§8.10.2).
8.13 Pernyataan inlinescript
Sintaksis:
inlinescript-statement:
inlinescript statement-block
Pernyataan inlinescript berisi nol atau lebih pernyataan yang dijalankan dengan cara yang ditentukan oleh implementasi.
Pernyataan inlinescript hanya diizinkan dalam alur kerja (§8.10.2).
8.14 Pengikatan Parameter
Saat skrip, fungsi, filter, atau cmdlet dipanggil, setiap argumen dapat terikat ke parameter yang sesuai berdasarkan posisi, dengan parameter pertama memiliki posisi nol.
Pertimbangkan fragmen definisi berikut untuk fungsi yang disebut Get-Power, dan panggilan ke dalamnya:
function Get-Power ([long]$Base, [int]$Exponent) { ... }
Get-Power 5 3 # argument 5 is bound to parameter $Base in position 0
# argument 3 is bound to parameter $Exponent in position 1
# no conversion is needed, and the result is 5 to the power 3
Get-Power 4.7 3.2 # double argument 4.7 is rounded to int 5, double argument
# 3.2 is rounded to int 3, and result is 5 to the power 3
Get-Power 5 # $Exponent has value $null, which is converted to int 0
Get-Power # both parameters have value $null, which is converted to int 0
Saat skrip, fungsi, filter, atau cmdlet dipanggil, argumen dapat terikat ke parameter yang sesuai berdasarkan nama. Ini dilakukan dengan menggunakan parameter dengan argumen, yang merupakan argumen yang merupakan nama parameter dengan tanda hubung (-), diikuti oleh nilai terkait untuk argumen tersebut. Nama parameter yang digunakan dapat memiliki ejaan yang tidak peka huruf besar/kecil dan dapat menggunakan awalan apa pun yang secara unik menunjuk parameter yang sesuai. Saat memilih nama parameter, hindari menggunakan nama parameter umum .
Pertimbangkan pemanggilan berikut untuk fungsi Get-Power:
Get-Power -Base 5 -Exponent 3 # -Base designates $Base, so 5 is
# bound to that, -Exponent designates
# $Exponent, so 3 is bound to that
Get-Power -Exp 3 -Bas 5 # $Base takes on 5 and $Exponent takes on 3
Get-Power -E 3 -B 5 # $Base takes on 5 and $Exponent takes on 3
Di sisi lain, pemanggilan ke fungsi berikut ini
function Get-Hypot ([double]$Side1, [double]$Side2) {
return [Math]::Sqrt($Side1 * $Side1 + $Side2 * $Side2)
}
harus menggunakan parameter -Side1 dan -Side2, karena tidak ada awalan yang secara unik menunjuk parameter.
Nama parameter yang sama tidak dapat digunakan beberapa kali dengan atau tanpa nilai argumen terkait yang berbeda.
Parameter dapat memiliki atribut (§12). Untuk informasi tentang atribut individual, lihat bagian dalam §12,3. Untuk informasi tentang set parameter, lihat §12,3.7.
Skrip, fungsi, filter, atau cmdlet dapat menerima argumen melalui baris perintah pemanggilan, dari alur, atau dari keduanya. Berikut adalah langkah-langkahnya, untuk menyelesaikan pengikatan parameter:
- Kaitkan semua parameter bernama, lalu
- Ikat parameter posisi, lalu
- Ikat dari alur menurut nilai (§12,3,7) dengan kecocokan yang tepat, lalu
- Ikat dari alur menurut nilai (§12,3,7) dengan konversi, lalu
- Mengikat dari alur berdasarkan nama (§12.3.7) dengan pencocokan yang tepat, lalu
- Ikat dari alur kerja berdasarkan nama (§12.3.7) dengan konversi
Beberapa langkah ini melibatkan konversi, seperti yang dijelaskan dalam §6. Namun, kumpulan konversi yang digunakan dalam pengikatan tidak sama persis dengan yang digunakan dalam konversi bahasa. Secara khusus
- Meskipun nilai
$nulldapat dilemparkan ke bool,$nulltidak dapat terikat kebool. - Ketika nilai
$nullditeruskan ke[switch]parameter untuk cmdlet, nilai diperlakukan seolah-olah$truediteruskan. Namun, ketika diteruskan ke[switch]parameter untuk fungsi, itu diperlakukan seolah-olah$falsediteruskan. - Parameter bertipe bool atau sakelar hanya dapat mengikat ke argumen bertipe numerik atau bool.
- Jika jenis parameter bukan koleksi, tetapi argumennya adalah semacam koleksi, tidak ada konversi yang dicoba kecuali jenis parameter adalah objek atau PsObject. (Inti dari pembatasan ini adalah melarang konversi koleksi ke parameter string.) Selain itu, upaya konversi seperti biasa akan dilakukan.
Jika jenis parameter IList atau ICollection<T>, hanya konversi tersebut melalui Konstruktor, op_Implicit, dan op_Explicit yang dicoba. Jika tidak ada konversi seperti itu, konversi khusus untuk parameter jenis "koleksi" digunakan, yang mencakup IList, ICollection<T>, dan array.
Parameter posisi lebih suka diikat tanpa konversi jenis, jika memungkinkan. Misalnya
function Test {
[CmdletBinding(DefaultParameterSetName = "SetB")]
param([Parameter(Position = 0, ParameterSetName = "SetA")]
[decimal]$Dec,
[Parameter(Position = 0, ParameterSetName = "SetB")]
[int]$In
)
$PSCmdlet.ParameterSetName
}
Test 42d # outputs "SetA"
Test 42 # outputs "SetB"