Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Editörün notu
Önemli
Windows PowerShell Dil Belirtimi 3.0 Aralık 2012'de yayımlanmıştır ve Windows PowerShell 3.0'ı temel alır. Bu belirtim PowerShell'in geçerli durumunu yansıtmaz. Bu belgeleri geçerli durumu yansıtacak şekilde güncelleştirme planı yoktur. Bu belgeler, geçmişe yönelik başvuru için burada sunulmuştur.
Belirtim belgesi, Şu konumdaki Microsoft İndirme Merkezi'nden bir Microsoft Word belgesi olarak kullanılabilir: https://www.microsoft.com/download/details.aspx?id=36389 Bu Word belgesi burada Microsoft Learn'de sunu için dönüştürülmüştür. Dönüştürme sırasında, Docs platformu için biçimlendirmeye uyum sağlamak için bazı editoryal değişiklikler yapılmıştır. Bazı yazım hataları ve küçük hatalar düzeltildi.
8.1 Deyim blokları ve listeleri
Sözdizimi:
Tavsiye
Söz dizimi tanımlarındaki ~opt~ gösterimi söz diziminde sözcüksel varlığın isteğe bağlı olduğunu gösterir.
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
Açıklama:
deyimi gerçekleştirilecek bir eylem türünü belirtir. Bu yan tümce içinde aksi belirtilmediği sürece deyimler sözcük düzeninde yürütülür.
deyim bloğu, bir deyim kümesinin tek bir söz dizimli birimde gruplandırılmasına olanak tanır.
8.1.1 Etiketli deyimler
Sözdizimi:
labeled-statement:
switch-statement
foreach-statement
for-statement
while-statement
do-statement
Açıklama:
Bir yineleme deyimi (§8.4) veya switch deyimi (§8.6) isteğe bağlı olarak hemen bir deyim etiketi, etiket, ile başlayabilir. Etiket ifadesi, break (§8.5.1) veya devam (§8.5.2) deyiminin opsiyonel hedefi olarak kullanılır. Ancak, bir etiket denetim akışını değiştirmez.
İki nokta üst üste (:) ile onu izleyen belirteç arasında beyaz boşluklara izin verilmez.
Örnekler:
: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 Beyan değerleri
Bir ifadenin değeri, işlem hattına yazdığı değerlerin birikimli kümesidir. Deyim tek bir skaler değer yazarsa, bu, deyimin değeridir. deyimi birden çok değer yazarsa, deyiminin değeri, kısıtlanmamış bir 1 boyutlu dizinin öğelerinde, yazıldıkları sırayla depolanan değer kümesidir. Aşağıdaki örneği göz önünde bulundurun:
$v = for ($i = 10; $i -le 5; ++$i) { }
Döngü yinelemesi yoktur ve işlem hattına hiçbir şey yazılmamıştır. İfadenin değeri $null.
$v = for ($i = 1; $i -le 5; ++$i) { }
Döngü beş kez yinelese de işlem hattına hiçbir şey yazılmaz. Deyimin değeri $null'dur.
$v = for ($i = 1; $i -le 5; ++$i) { $i }
Döngü, işlem hattına int değeri $iyazarken beş kez yineleme yapar. Açıklamanın değeri Uzunluk 5 olan object[]'dır.
$v = for ($i = 1; $i -le 5; ) { ++$i }
Döngü beş kez yinelese de işlem hattına hiçbir şey yazılmaz. İfadenin değeri $null.
$v = for ($i = 1; $i -le 5; ) { (++$i) }
Döngü, her değerin işlem hattına yazılmasıyla beş kez yinelenir. Açıklamanın değeri Uzunluk 5 olan object[]'dır.
$i = 1; $v = while ($i++ -lt 2) { $i }
Döngü bir kez yinelenir. deyiminin değeri, 2 değerine sahip int değeridir.
Aşağıda diğer bazı örnekler verilmiştir:
# 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 Boru hattı ifadeleri
Sözdizimi:
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
Açıklama:
yeniden yönlendirmeleri§7.12; atama ifadesi§7.11; ve komut çağrı operatörü nokta (.) §3.5.5tartışılır. Komut çağrılarında bağımsız değişkenden parametreye eşlemenin tartışması için bkz. §8.14.
işlem hattındaki ilk komut, bir ifade ya da bir komut çağırmasıdır. Genellikle, bir komut çağrısı genellikle çıplak bir tanımlayıcı olan komut-adıile başlar. komut öğeleri komutun bağımsız değişken listesini temsil eder. Yeni satır veya n sıralanmamış noktalı virgül işlem hattını sonlandırır.
Komut çağırma, komutun adından ve ardından sıfır veya daha fazla bağımsız değişkenden oluşur. Tartışmaları yöneten kurallar şunlardır:
İfade olmayan, ancak boş boşluk içermeyen rastgele metin içeren bir bağımsız değişken, çift tırnak içine alınmış gibi değerlendirilir. Harflerin büyük/küçük yazılması korunur.
Değişken değiştirme ve alt ifade genişletmesi (§2.3.5.2), genişletilebilir-dize-değişmez-değerve genişletilebilir-burada-dize-değişmez-değeriçinde gerçekleşir.
Tırnak işaretleri içindeki metin, bağımsız değişkenin değerine baştaki, sondaki ve gömülü boşlukların eklenmesini sağlar. [Not: Bir argümanın tırnak içinde boşluk olması, tek bir argümanı birden çok argümana dönüştürmez. son not]
Bir argümanın etrafına parantez koymak, bu ifadeyi sonuçla değerlendirir ve sonuç, özgün ifadenin metni yerine geçirilir.
Anahtar parametresine benzeyen (§2.3.4) ancak bu şekilde tasarlanmamış bir bağımsız değişkeni geçirmek için, bu bağımsız değişkeni tırnak içine alın.
[switch]tür kısıtlamasına (§8.10.5) sahip bir parametreyle eşleşen bir bağımsız değişken belirtilirken, bağımsız değişken adının kendi başına bulunması bu parametrenin$trueolarak ayarlanmasına neden olur. Ancak parametrenin değeri, bağımsız değişkene bir sonek eklenerek açıkça ayarlanabilir. Örneğin, belirli bir türle kısıtlanmış parametresi pverildiğinde,-p:$truebağımsız değişkeni p'yi true olarak ayarlarken,-p:$falsep'yi false olarak ayarlar.--bağımsız değişkeni, bunu izleyen tüm bağımsız değişkenlerin orijinal halleriyle, çevrelerine çift tırnak yerleştirilmiş gibi geçirileceklerini gösterir.--%bağımsız değişkeni, bunu izleyen tüm bağımsız değişkenlerin en az seviyede ayrıştırma ve işleme ile geçirileceğini belirtir. Bu bağımsız değişken, "verbatim" (birebir) parametre olarak adlandırılır. Ayrıntılı parametreden sonraki bağımsız değişkenler, söz dizimsel olarak geçerli PowerShell ifadeleri olsalar bile PowerShell ifadeleri değildir.
Komut türü Application ise, --% parametresi komuta geçirılmaz.
--%'dan sonraki bağımsız değişkenlerde bulunan ortam değişkenleri (yani %ile çevrili dizeler) genişletilir. Örneğin:
echoargs.exe --% "%path%" # %path% is replaced with the value $Env:path
Bağımsız değişkenlerin değerlendirilme sırası belirtilmemiştir.
Parametre bağlama hakkında bilgi için bkz. §8.14. Ad arama hakkında bilgi için bkz. §3.8.
Bağımsız değişken işleme tamamlandıktan sonra komut çağrılır. Çağrılan komut normal şekilde sonlandırılırsa (§8.5.4), denetim komut çağrısından hemen sonra betikteki veya işlevdeki noktaya geri döner. Anormal sonlandırma davranışının açıklaması için bkz. break (§8.5.1), continue (§8.5.2), throw (§8.5.. 3), exit (§8.5.5), try (§8.7) ve trap (§8.8).
Normalde, bir komut, adı ve ardından gelen bağımsız değişkenler kullanılarak çağrılır. Ancak, &komut çağırma işleci kullanılabilir. Komut adı boş boşluk içeriyorsa, bu işleçle tırnak içine alınıp çağrılmalıdır. Betik bloğunun adı olmadığından, bu işleçle de çağrılmalıdır. Örneğin, aşağıdaki komut çağrıları Get-Factorial çağrısı ile eşdeğerdir:
Get-Factorial 5
& Get-Factorial 5
& "Get-Factorial" 5
Doğrudan ve dolaylı özyinelemeli işlev çağrılarına izin verilir. Örneğin
function Get-Power([int]$x, [int]$y) {
if ($y -gt 0) { return $x * (Get-Power $x (--$y)) }
else { return 1 }
}
Örnekler:
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 If deyimi
Sözdizimi:
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
Açıklama:
işlem hattı denetim ifadelerinin türü bool olmalıdır veya bu türe örtük olarak dönüştürülebilir olmalıdır. else yan tümcesi isteğe bağlıdır. Sıfır veya daha fazla elseif yan tümcesiolabilir.
Üst düzey işlem hattı True'yu test ederse, deyim bloğu yürütülür ve deyiminin yürütülmesi sonlandırılır. Aksi takdirde, bir elseif yan tümcesi varsa, işlem hattı True'yu test, deyimi-bloğu yürütülür ve deyiminin yürütülmesi sonlandırılır. Aksi takdirde, bir else yan tümcesi varsa, ifadeler bloğu yürütülür.
Örnekler:
$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 Yineleme deyimleri
8.4.1 While deyimi
Sözdizimi:
while-statement:
while new-lines~opt~ ( new-lines~opt~ while-condition new-lines~opt~ ) statement-block
while-condition:
new-lines~opt~ pipeline
Açıklama:
Denetim ifadesi while-condition türü bool olmalıdır veya örtük olarak bu türe dönüştürülebilir olmalıdır. "deyim bloğu" içeren döngü gövdesi, denetim ifadesi "False" sonucunu alana kadar tekrarlı olarak yürütülür. Denetim ifadesi, döngü gövdesinin her yürütülmesinden önce değerlendirilir.
Örnekler:
$i = 1
while ($i -le 5) { # loop 5 times
"{0,1}`t{1,2}" -f $i, ($i*$i)
++$i
}
8.4.2 Do deyimi
Sözdizimi:
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
Açıklama:
Denetim ifadesi while-condition türü bool olmalıdır veya örtük olarak bu türe dönüştürülebilir olmalıdır. while döngü biçiminde, kontrol ifadesi Doğru'yu test ettiği sürece, deyim bloklarıiçeren döngü gövdesi tekrar tekrar yürütülür. Until formunda, denetim ifadesi True'yu test edene kadar döngü gövdesi art arda yürütülür. Denetim ifadesi, döngü gövdesinin her yürütülmesinden sonra değerlendirilir.
Örnekler:
$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 For deyimi
Sözdizimi:
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
Açıklama:
Koşul için denetim ifadesi türü bool olmalıdır veya örtük olarak bu türe dönüştürülebilir olmalıdır. deyim bloğuiçeren döngü gövdesi, denetim ifadesi True olarak test edildiği sürece art arda yürütülür. Denetim ifadesi, döngü gövdesinin her yürütülmesinden önce değerlendirilir.
başlatıcı için ifade, denetim ifadesi ilk değerlendirmeden önce değerlendirilir. başlatıcı için ifade yalnızca yan etkileri için değerlendirilir; ürettiği herhangi bir değer atılır ve işlem hattına yazılmaz.
İfade yineleyici, döngü gövdesinin her yürütülmesinden sonra değerlendirilir. İfade yineleyici yalnızca yan etkileri için değerlendirilir; ürettiği herhangi bir değer atılır ve işlem hattına yazılmaz.
Koşul için ifade atlanırsa, denetim ifadesi True'yu sınar.
Örnekler:
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 Foreach deyimi
Sözdizimi:
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
Açıklama:
deyimi-bloğuiçeren döngü gövdesi, işlem hattı tarafından belirlenen koleksiyonda değişken değişken tarafından belirlenen her öğe için yürütülür.
değişken kapsamı foreach deyimiyle sınırlı değildir. Bu nedenle, döngü gövdesi yürütmeyi tamamladıktan sonra son değerini korur.
işlem hattı bir koleksiyon yerine bir skaler ($null değeri hariç) atarsa, bu skaler bir öğenin koleksiyonu olarak değerlendirilir. Eğer işlem hattı$nulldeğerini belirtiyorsa, işlem hattı sıfır öğeli bir koleksiyon olarak değerlendirilir.
foreach-parametresi-parallel belirtilirse, davranış uygulamaya göre tanımlanır.
foreach-parameter‑parallel yalnızca bir iş akışında izin verilir (§8.10.2).
Her foreach deyiminin yalnızca bu döngü yürütülürken var olan kendi numaralandırıcısı $foreach (§2.3.2.2, §4.5.16) vardır.
işlem hattı tarafından üretilen nesneler, deyim bloğu yürütülmeye başlamadan önce toplanır. Ancak ForEach-Object cmdlet'iyle, ifade bloğu her nesne oluşturulduğunda yürütülür.
Örnekler:
$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 Akış denetimi deyimleri
Sözdizimi:
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
Açıklama:
Akış denetimi deyimi, denetimin başka bir konuma koşulsuz olarak aktarılmasına neden olur.
8.5.1 Kesme deyimi
Açıklama:
etiket-ifadesi içeren break ifadesi, etiketli break ifadesi olarak adlandırılır. etiket-ifadesi olmayan bir kesme deyimi, etiketlenmemişkesme deyimi olarak adlandırılır.
Bir yakalama deyiminin dışında, etiketsiz durdurma deyimi, doğrudan en küçük kapsayıcı yineleme deyiminin yürütülmesini sonlandırır (§8.4). Etiketsiz bir break deyimi, doğrudan bir switch deyiminin (§8.6) içinde, mevcut switch'in switch koşuluiçin desen eşleştirmeyi sonlandırır. Tuzak deyiminden kesmenin nasıl kullanılacağına dair ayrıntılar için bkz. (§8.8).
Yineleme deyimi veya switch deyimi isteğe bağlı olarak hemen bir deyim etiketiyle (§8.1.1) önce gelebilir. Böyle bir deyim etiketi etiketli break deyiminin hedefi olarak kullanılabilir; bu durumda, bu deyim hedeflenen kapsayan yineleme deyiminin yürütülmesini sonlandırır.
Etiketli bir kesmenin herhangi bir yerel kapsamda çözümlenmesi gerekmez; eşleşen bir etiket araması, betik ve işlev çağrısı sınırları arasında bile çağrı yığınını artırmaya devam edebilir. Eşleşen etiket bulunmazsa, geçerli komut çağırma sonlandırılır.
etiket-ifadesi tarafından belirlenen etiketin adı sabit bir değere sahip olması gerekmez.
etiket-ifadesi bir tekli ifadeise, bir dizeye dönüştürülür.
Örnekler:
$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 Continue deyimi
Açıklama:
continue ifadeyi içeren bir deyimi, etiketli devam deyimi olarak adlandırılır. etiket-ifadesi olmayan bir continue deyimi, etiketlenmemişcontinue deyimi olarak adlandırılır.
Bir yakalama deyiminin içinden continue kullanımı, §8.8içinde ele alınılmaktadır.
Döngü içindeki etiketsiz bir continue deyimi, geçerli döngünün yürütülmesini sonlandırır ve denetimi en küçük kapsayan döngü deyiminin kapanış ayracına yönlendirir (§8.4). Bir anahtar ifadesi içinde yer alan etiketlenmemiş continue deyimi, geçerli switch yinelemesinin yürütülmesini sonlandırır ve denetimi en küçük iç içe geçmiş switch'nin anahtar koşulu (§8.6) aktarır.
Bir yineleme deyimi veya switch deyimi (§8.6), isteğe bağlı olarak bir deyim etiketiyle (§8.1.1) hemen önce gelebilir. Böyle bir deyim etiketi, kapalı etiketli bir continue deyiminin hedefi olarak kullanılabilir; bu durumda, bu deyim geçerli döngünün veya switch yinelemenin yürütülmesini sonlandırır ve denetimi hedeflenen kapsayan yinelemeye veya switch deyimi etiketine aktarır.
Etiketli continue hiçbir yerel kapsamda çözümlenmemesi gerekir; eşleşen etiket araması, betik ve işlev çağrısı sınırları arasında bile çağrı yığınını continue. Eşleşen etiket bulunmazsa, geçerli komut çağırma sonlandırılır.
etiket-ifadesi tarafından belirlenen etiketin adı sabit bir değere sahip olması gerekmez.
etiket-ifadesi bir tekli ifadeise, bir dizeye dönüştürülür.
Örnekler:
$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 Throw ifadesi
Açıklama:
Özel durum, sistem veya uygulama düzeyi hata koşulunu işlemenin bir yoludur. throw deyimi bir istisna oluşturur. (Özel durum işlemeyle ilgili bir tartışma için bkz. §8.7.)
işlem hattı atlanırsa ve throw deyimi catch-clausedeğilse, davranış uygulama tanımlıdır. işlem hattı varsa ve throw deyimi catch-clauseise, bu catch-clause tarafından yakalanan özel durum, catch-clause ile ilişkili finally yan tümcesi yürütüldükten sonra yeniden oluşturulur.
işlem hattı varsa, oluşan özel durumun türü uygulama tarafından tanımlanır.
Özel durum fırlatıldığında kontrol, özel durumu işleyebilecek bağlamdaki try deyimindeki ilk catch yan tümcesine aktarılır. Özel durumun ilk olarak fırlatıldığı konum, fırlatma noktasıolarak adlandırılır. Bir özel durum atıldığında, §8.7'de açıklanan adımlar, özel durumla eşleşen bir catch yan tümcesi bulunduğu veya olmadığı sürece art arda izlenir.
Örnekler:
throw
throw 100
throw "No such record in file"
işlem hattı atlanırsa ve throw deyimi catch bloğuiçinden değilse, "ScriptHalted" metni işlem hattına yazılır ve oluşan özel durumun türü System.Management.Automation.RuntimeException'tir.
işlem hattı varsa, oluşan özel durum, System.Management.Automation.RuntimeExceptionaracılığıyla erişilebilen System.Management.Automation.ErrorRecord nesnesi olarak özel durum bilgilerini içeren $_türünde bir nesneye sarılır.
Örnek 1: throw 123, RuntimeException türünde bir özel durumla sonuçlanmaktadır. Catch bloğu içindeyken, $_.TargetObject içinde sarılmış nesneyi barındırır, bu durumda değeri 123 olan bir System.Int32.
Örnek 2: throw "xxx", RuntimeExceptiontüründe bir özel durumla sonuçlanmaktadır. Catch bloğunun içinden, $_.TargetObject, içinde sarmalanmış nesneyi içerir; bu durumda, "xxx" değerine sahip bir System.String.
Örnek 3: throw 10,20, RuntimeExceptiontüründe bir özel durumla sonuçlanmaktadır. catch bloğunun içinden, $_.TargetObject içeride sarmalanan nesneyi barındırır, bu durumda, System.Object[]ile iki öğeden oluşan sınırsız bir Systemdizisidir. Değerler System.Object[].Int32` olan 10 ve 20.
8.5.4 Geri Dönüş Deyimi
Açıklama:
return deyimi, varsa işlem hattı tarafından belirlenen değerleri işlem hattına yazar ve denetimi işlevin veya betiğin çağıranına döndürür. bir işlev veya betik sıfır veya daha fazla return deyimine sahip olabilir.
Yürütme bir işlevin kapanış ayracına ulaşırsa, return olmadan zımni bir varsayılır.
return deyimi, programcıların kendilerini diğer dillerde olduğu gibi ifade etmelerine izin vermek için biraz 'söz dizimsel şeker'dir; ancak, bir işlevden veya betikten döndürülen değer, aslında bu işlev veya betik tarafından işlem hattına yazılan tüm değerler ile işlem hattı tarafından belirtilen değer(ler)den oluşur. İşlem hattına yalnızca bir skaler değer yazılırsa, türü döndürülen değerin türüdür; aksi takdirde, dönüş türü işlem hattına yazılan tüm değerleri içeren kısıtlanmamış bir 1 boyutlu dizidir.
Örnekler:
function Get-Factorial ($v) {
if ($v -eq 1) {
return 1 # return is not optional
}
return $v * (Get-Factorial ($v - 1)) # return is optional
}
Get-Factorial'yi arayan bir intgeri alır.
function Test {
"text1" # "text1" is written to the pipeline
# ...
"text2" # "text2" is written to the pipeline
# ...
return 123 # 123 is written to the pipeline
}
Test çağıran, üç öğeden oluşan kısıtlanmamış bir 1 boyutlu diziyi geri alır.
8.5.5 Çıkış deyimi
Açıklama:
exit deyimi geçerli betiği sonlandırır ve konak ortamına veya çağrı betiğine denetimi ve bir çıkış kodunu döndürür. işlem hattı sağlandığında, işaret ettiği değer gerekirse tamsayıya dönüştürülür. Böyle bir dönüştürme yoksa veya işlem hattı atlanırsa, sıfır int değeri döndürülür.
Örnekler:
exit $count # terminate the script with some accumulated count
8.6 Switch deyimi
Sözdizimi:
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
Açıklama:
anahtar koşulu tek bir değer belirtirse, denetim bir veya daha fazla eşleşen desen deyimi bloğuna geçirilir. Hiçbir desen eşleşmezse, bazı varsayılan eylemler yapılabilir.
Anahtar, her biri bir desenle (varsayılan olmayan switch yan tümcesi) veya anahtar sözcük (default) ile başlayan bir veya daha fazla switch-yan tümcesiiçermelidir. Anahtar sıfır veya bir default anahtar yan tümcesi ve sıfır veya daha fazla varsayılan olmayan anahtar yan tümcesi içermelidir. Switch yan tümceleri herhangi bir sırayla yazılabilir.
Birden çok desen aynı değere sahip olabilir. Bir desenin harfi olması gerekmez ve bir anahtar yapısının farklı türlerde desenleri olabilir.
anahtar koşulu değeri bir desen değeriyle eşleşiyorsa, bu desenin deyim bloğu yürütülür. Birden fazla desen değeri, anahtar koşuludeğeriyle eşleştiğinde, eşleşen her bir desenin deyim bloğu, bu deyim bloklarındanherhangi biri bir break deyimi (§8.5.1) içermediği sürece, sözcük sırasına göre yürütülür.
anahtar-kosulu değeri herhangi bir desen değeriyle eşleşmiyorsa, bir default anahtar ifadeli cümle varsa, onun ifade bloğu yürütülür; aksi takdirde, bu anahtar-kosulu için desen eşleştirmesi sonlandırılır.
Anahtarlar iç içe olabilir ve her anahtarın kendi anahtar koşulları kümesi vardır. Bu gibi durumlarda, switch deyimi şu anki kapsamda olan en içteki anahtara aittir.
Her deyim bloğunagirişte, $_ otomatik olarak, denetimi o deyim bloğunayönlendiren anahtar koşulu değerine atanır.
$_ ayrıca deyim bloğu'nın anahtar deyim durumu koşulundakullanılabilir.
Dize olmayanların eşleşmesi eşitlik testiyle yapılır (§7.8.1).
Eşleştirme dizeleri içeriyorsa, varsayılan olarak karşılaştırma büyük/küçük harfe duyarlı değildir.
switch-parameter-CaseSensitive varlığı, karşılaştırmayı büyük/küçük harfe duyarlı hale getirir.
Bir desen joker karakter içerebilir (§3.15), bu durumda joker karakter dizesi karşılaştırmaları gerçekleştirilir, ancak yalnızca anahtar parametresi-Wildcard varsa. Varsayılan olarak, karşılaştırma büyük/küçük harfe duyarlı değildir.
Bir desen normal ifade içerebilir (§3.16), bu durumda normal ifade dizesi karşılaştırmaları gerçekleştirilir, ancak sadece anahtar-parametre-Regex mevcutsa. Varsayılan olarak, karşılaştırma büyük/küçük harfe duyarlı değildir.
-Regex varsa ve bir desen eşleştirilirse, $Matches bu desen için geçiş cümleciğiifade bloğunda tanımlanır.
anahtar parametresi kısaltılabilir; bir parametrenin herhangi bir belirgin ön kısmı kullanılabilir. Örneğin, ‑Regex, ‑Rege, ‑Reg, ‑Reve ‑R eşdeğerdir.
Çakışan anahtar-parametreler belirtilirse, sözcük sırası bakımından sonuncusu geçerli olur.
‑Exact varlığı -Regex ve -Wildcarddevre dışı bırakır; ancak ‑Caseüzerinde hiçbir etkisi yoktur.
anahtar-parametresi‑Parallel belirtilirse, davranış uygulama tarafından belirlenir.
anahtar parametresi‑Parallel yalnızca bir iş akışında kullanılmasına izin verilir (§8.10.2).
Desen bir betik-blok-ifadesiise, bu blok değerlendirilir ve gerekirse, sonuç boolean'a dönüştürülür. Sonuç $truedeğerine sahipse, karşılık gelen ifade bloğu yürütülür; değilse, yürütülmez.
anahtar koşulu birden çok değer belirlerse anahtar, tek bir değer belirten anahtar koşulu için yukarıda açıklanan kurallar kullanılarak her değere sözcük temelli olarak uygulanır. Her switch ifadesinin kendi numaralandırıcısı vardır ($switch (§2.3.2.2, §4.5.16)), bu da yalnızca o switch yürütülürken var olur.
Switch deyiminin etiketi olabilir ve etiketli ve etiketsiz break (§8.5.1) ve continue (§8.5.2) deyimlerini içerebilir.
anahtar-koşul-Fileanahtar-dosya adıise, bir ifadedeki değerleri yinelemek yerine, anahtar switch-filenametarafından belirlenen dosyadaki değerler üzerinde yinelenir. Dosya, her satır bir değerden oluşan bir satırla aynı anda okunur. Satır sonlandırıcı karakterleri değerlere dahil değildir.
Örnekler:
$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 try/finally ifadesi
Sözdizimi:
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
Açıklama:
try deyimi, bir bloğun yürütülmesi sırasında oluşan özel durumları yakalamak için bir mekanizma sağlar. try deyimi, denetim try deyiminden ayrıldığında her zaman yürütülen bir kod bloğu belirtme olanağı da sağlar. throw deyimi aracılığıyla özel durum oluşturma işlemi §8.5.3içinde açıklanmıştır.
Deneme bloğu, try deyimiyle ilişkilendirilmiş ifade bloğudur. yakalama bloğu, yakalama cümlesiile ilişkili deyim bloğudur. finally bloğu, finally yan tümcesiile ilişkili deyim bloğudur.
catch-type-list içermeyen catch-clause, genel catch yan tümcesi olarak adlandırılır.
Her catch-yan tümcesiözel durum işleyicisidir ve catch-type-list tetiklenen özel durumun türünü içeren catch-clauseeşleşen catch yan tümcesidir. Genel catch tümcesi tüm özel durum türleriyle eşleşir.
catch blokları ve finally bloğu isteğe bağlı olsa da, bunlardan en az birinin bulunması gerekir.
Fırlatılan bir özel durumun işlenmesi, özel durumla eşleşen bir catch yan tümcesi bulunana kadar aşağıdaki adımların tekrar tekrar değerlendirilmesini içerir.
Geçerli kapsamda, atma noktasını kapsayan her try deyimi incelenir. En içteki try deyiminden başlayıp en dıştaki try deyimiyle biten S her try deyimi için aşağıdaki adımlar değerlendirilir:
trybloğu atma noktasını kapsıyorsa ve S bir veya daha fazla catch deyimi varsa, catch deyimleri özel durum için uygun bir işleyici bulmak üzere leksik sırada incelenir. İstisna türünü veya istisna türünün temel türünü belirten ilk catch yan cümlesi, eşleşme olarak değerlendirilir. Genel catch bloğu, herhangi bir istisna türü için eşleşme olarak kabul edilir. Eşleşen bir catch bloğu bulunursa, denetim bu catch bloğunun içine aktarılarak özel durum işleme tamamlanır. Eşleşen bir catch yan tümcesi içinde,$_değişkeni geçerli özel durumun açıklamasını içerir.Aksi takdirde,
trybloğu veyacatchbloğu atma noktasını kapatıyorsa ve Sfinallybloğu varsa, denetim finally bloğuna aktarılır.finallyBlok başka bir özel durum oluşturursa geçerli özel durumun işlenmesi sonlandırılır. Aksi takdirde denetimfinallybloğunun sonuna ulaştığında geçerli özel durumun işlenmesine devam edilir.
Bir özel durum işleyicisi geçerli kapsamda yer almadıysa, yukarıdaki adımlar kapsayan kapsam için geçerli kapsamın çağrıldığı deyime karşılık gelen bir atma noktasıyla yinelenir.
Özel durum işleme, özel durum için işleyici olmadığını belirleyerek tüm kapsamların sonlanmasına neden oluyorsa, davranış belirtilmez.
Bir try bloğunda ulaşılamayan catch yan tümcelerini önlemek için, catch yan tümcesi aynı try bloğu içindeki önceki catch yan tümcesinde belirtilen türe eşit veya türetilmiş bir özel durum türü belirtilmemelidir.
finally bloğunun deyimleri, kontrol try deyiminden çıktığında her zaman yürütülür. Denetim aktarımı, normal yürütmenin bir sonucu olarak, bir break, continueveya return deyiminin yürütülmesi sonucu veya try deyiminden bir istisna fırlatılması sonucu meydana gelsin, bu doğrudur.
Eğer bir finally bloğunun yürütülmesi sırasında bir özel durum oluşturulursa, bu özel durum dışa atılarak sonraki kapsayıcı try deyimine yönlendirilir. Başka bir istisna ele alınıyorsa, bu istisna kaybolur. Özel durum oluşturma işlemi, throw deyiminin açıklamasında daha ayrıntılı olarak ele alınıyor.
try deyimleri trap deyimleriyle birlikte bulunabilir; Ayrıntılar için bkz. §8.8.
Örnekler:
$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 {
# ...
}
}
Fırlatılan her özel durum System.Management.Automation.RuntimeExceptionolarak yükseltilir.
bloğunda türe özgü tryvarsa, özel durumun InnerException niteliği, yukarıdaki tür System.IndexOutOfRangeException gibi bir eşleşme bulmaya çalışmak amacıyla incelenir.
8.8 Tuzak deyimi
Sözdizimi:
trap-statement:
*trap* new-lines~opt~ type-literal~opt~ new-lines~opt~ statement-block
Açıklama:
trap olan ve olmayan deyimi, sırasıyla catcholan ve olmayan bir bloğuna (§8.7) benzer, ancak trap deyimi aynı anda yalnızca bir türü yakalayabilir.
Aynı trapbirden çok deyimi tanımlanabilir ve tanım sırası önemli değildir. Eğer aynı trap'ye sahip iki deyimi aynı kapsamda tanımlanırsa, eşleşen türün özel durumunu işlemekte sözcüksel olarak ilk deyim kullanılır.
catch bloğunun aksine, bir trap deyimi tam olarak bir özel durum türüyle eşleşir; türetilmiş tür eşleştirmesi yapılmaz.
Bir hata oluştuğunda, mevcut kapsamda eşleşen bir trap ifadesi yoksa, kapsayıcı kapsamda eşleşen bir tuzak ifadesi aranır. Bu, çağıran betik, işlev veya filtreye ve ardından daha üst düzey çağıranlarına bakmayı içerebilir. Arama, bir özel durum için işleyici olmadığını belirterek tüm kapsamları sonlandırırsa, bu durumda davranışın nasıl olacağı belirtilmemiştir.
bir trap deyiminin deyim gövdesi yalnızca ilgili özel durumu işlemek için yürütülür; aksi takdirde, yürütme üzerinden geçer.
Bir trapdeyim gövdesi normal şekilde çıkarsa, varsayılan olarak hata akışına bir hata nesnesi yazılır, özel durum işlenmiş olarak kabul edilir ve yürütme, özel durumu görünür hale getiren trap deyimini içeren kapsamdaki deyiminden hemen sonraki deyim ile devam eder. Özel durumun nedeni, trap deyimini içeren komut tarafından çağrılan bir komutta olabilir.
Bir trapdeyimi gövdesi'nde son yürütülen deyim bir devam et deyimiyse (§8.5.2), hata nesnesinin hata akışına yazılması gizlenir ve yürütme, özel durumu görünür hale getiren yakalama deyimini içeren kapsamdaki deyimin hemen ardından gelen deyimle devam eder. Bir trap'in deyimi-gövdesinde yürütülen son deyim break (§8.5.1) ise, hata nesnesinin hata akışına yazılması engellenir ve özel durum yeniden fırlatılır.
trap deyiminde $_ değişkeni geçerli hatanın açıklamasını içerir.
try bloğunun içinden tetiklenen bir istisnanın eşleşen bir catch bloğu bulunmaması, ancak daha üst bir blok seviyesinde eşleşen bir trap ifadesinin bulunması durumu üzerinde düşünün.
try bloğunun finally yan tümcesi yürütüldükten sonra trap deyimi, üst kapsamın eşleşen bir catch bloğu olsa bile denetimi alır.
trap bloğunun içinde bir try deyimi tanımlanırsa ve bu try bloğu eşleşen bir catch bloğuna sahipse, trap deyimi denetimi alır.
Örnekler:
Aşağıdaki örnekte, hata nesnesi yazılır ve yürütme, tuzağa neden olan ifadenin hemen ardından gelen ifadeyle devam eder; yani "Bitti" işlem hattına yazılır.
$j = 0; $v = 10/$j; "Done"
trap { $j = 2 }
Aşağıdaki örnekte, hata nesnesi bastırılır ve yürütme, tuzak durumunun hemen ardından gelen komutla devam eder; yani "Bitti" işlem hattına yazılır.
$j = 0; $v = 10/$j; "Done"
trap { $j = 2; continue }
Aşağıdaki örnekte, hata nesnesinin yazılması bastırılır ve özel durum yeniden fırlatılır.
$j = 0; $v = 10/$j; "Done"
trap { $j = 2; break }
Aşağıdaki örnekte, tuzak ve özel durum oluşturan deyimler aynı kapsamdadır. Özel durum yakalanıp işlendikten sonra yürütme işlem hattına 1 yazarak devam eder.
&{trap{}; throw '\...'; 1}
Aşağıdaki örnekte, tuzak ve istisna oluşturan deyimler farklı kapsamlardadır. Özel durum yakalanıp işlendikten sonra yürütme işlem hattına 2 (1 değil) yazarak devam eder.
trap{} &{throw '\...'; 1}; 2
8.9 Veri deyimi
Sözdizimi:
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
Açıklama:
Veri ifadesi, bir veri bölümüoluşturur ve bu bölümün verilerini koddan ayrı tutar. Bu ayrım, hata iletileri ve Yardım dizeleri gibi metinler için ayrı dize kaynak dosyaları gibi özellikleri destekler. Ayrıca farklı dillere çevrilecek dizeleri yalıtma, bulma ve işleme işlemlerini kolaylaştırarak uluslararasılaştırmayı desteklemeye yardımcı olur.
Bir betik veya işlev sıfır veya daha fazla veri bölümüne sahip olabilir.
Veri bölümünün deyim bloğu yalnızca aşağıdaki PowerShell özelliklerini içermeyle sınırlıdır:
-
-matchdışındaki tüm operatörler -
ififadesi - Aşağıdaki otomatik değişkenler:
$PSCulture,$PSUICulture,$true,$falseve$null. - Yorumlar
- Boru Hatları
- Noktalı virgülle ayrılmış deyimler (
;) - Sabitler
- ConvertFrom-StringData cmdlet'ine çağrılar
- SupportedCommand parametresiyle tanımlanan diğer cmdlet'ler
ConvertFrom-StringData cmdlet kullanılırsa anahtar/değer çiftleri herhangi bir dize sabiti kullanılarak ifade edilebilir. Ancak, genişletilebilir dize değişmezlerive burada genişletilebilir dize değişmezleriherhangi bir değişken değiştirme veya alt ifade genişletmesi içermemelidir.
Örnekler:
SupportedCommand parametresi, verilen cmdlet'lerin veya işlevlerin yalnızca veri oluşturduğunu gösterir.
Örneğin, aşağıdaki veri bölümü, xml dosyasındaki verileri biçimlendiren ConvertTo-Xmlkullanıcı tarafından yazılmış bir cmdlet içerir:
data -SupportedCommand ConvertTo-Xml {
Format-Xml -Strings string1, string2, string3
}
Veri bölümünün dizeleri bir karma tablosuna dönüştüren ve değeri ConvertFrom-StringDataatanmış bir $messages komutu içerdiği aşağıdaki örneği göz önünde bulundurun.
$messages = data {
ConvertFrom-StringData -StringData @'
Greeting = Hello
Yes = yes
No = no
'@
}
Karma tablosunun anahtarlarına ve değerlerine sırasıyla $messages.Greeting, $messages.Yesve $messages.Nokullanılarak erişilir.
Şimdi bu, İngilizce kaynak olarak kaydedilebilir. Almanca ve İspanyolca dillerindeki kaynaklar, aşağıdaki veri bölümleriyle ayrı dosyalarda oluşturulabilir:
$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
"@
}
veri adı mevcutsa, veri ifadesinin değerinin depolanacağı değişkeni (baştaki $kullanılmadan) belirtir. Özellikle, $name = data { ... }data name { ... }ile eşdeğerdir.
8.10 İşlev tanımları
Sözdizimi:
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
Açıklama:
işlev tanımı tanımlanan işlevin, filtrenin veya iş akışının adını ve varsa parametrelerinin adlarını belirtir. Ayrıca bu işlevin amacına ulaşmak için yürütülen, sıfır veya daha fazla deyim de içerir.
Her işlev System.Management.Automation.FunctionInfosınıfının bir örneğidir.
8.10.1 Filtre işlevleri
Normal bir işlev bir işlem hattında bir kez çalıştırılır ve $inputaracılığıyla giriş koleksiyonuna erişirken, filtre, giriş koleksiyonundaki her nesne için bir kez yürütülen özel bir işlev türüdür.
İşlenmekte olan nesne $_değişkeni aracılığıyla kullanılabilir.
Adlandırılmış blok içermeyen bir filtre (§8.10.7) işlem bloğu olan ancak herhangi bir başlangıç bloğu veya bitiş bloğu olmayan bir işleve eşdeğerdir.
Aşağıdaki filtre işlevi tanımını ve çağrılarını göz önünde bulundurun:
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
Her filtre System.Management.Automation.FilterInfo sınıfının bir örneğidir (§4.5.11).
8.10.2 İş Akışı işlevleri
İş akışı işlevi, uygulama tanımlı semantiği olan sıradan bir işlev gibidir. Bir iş akışı işlevi, bir dizi Windows Workflow Foundation etkinliğine çevrilir ve Windows Workflow Foundation motorunda yürütülür.
8.10.3 Bağımsız değişken işleme
Get-Poweradlı bir işlev için aşağıdaki tanımı göz önünde bulundurun:
function Get-Power ([long]$Base, [int]$Exponent) {
$result = 1
for ($i = 1; $i -le $Exponent; ++$i) {
$result *= $Base
}
return $result
}
Bu işlevin $Base ve $Exponentiki parametresi vardır. Ayrıca negatif olmayan üs değerleri için $Base^$Exponent^'ı hesaplayan ve sonucu Get-Power'i çağıran kişiye döndüren bir ifadeler kümesi içerir.
Betik, işlev veya filtre yürütmeye başladığında, her parametre ilgili bağımsız değişkenin değerini alarak başlatılır. Karşılık gelen bağımsız değişken yoksa ve varsayılan değer (§8.10.4) sağlanırsa, bu değer kullanılır; aksi takdirde, $null değeri kullanılır. Bu nedenle, her parametre, betik bloğubaşında atanarak başlatılmış gibi yeni bir değişkendir.
betik-parametresi tür kısıtlaması içeriyorsa (yukarıdaki [long] ve [int] gibi), ilgili bağımsız değişkenin değeri gerekirse bu türe dönüştürülür; aksi takdirde dönüştürme gerçekleşmez.
Betik, işlev veya filtre yürütmeye başladığında, içinde ad veya konuma bağlı olmayan tüm bağımsız değişkenleri sözcük düzeninde içeren kısıtlanmamış bir 1 boyutlu dizi olarak değişken $args tanımlanır.
Aşağıdaki işlev tanımını ve çağrılarını göz önünde bulundurun:
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
Parametre bağlama hakkında daha fazla bilgi için bkz. §8.14.
8.10.4 Parametre başlatıcıları
"p bir parametre bildirimi bir başlatıcı içerebilir; bu durumda, ve ancak p çağrıdaki hiçbir bağımsız değişkene bağlı değilse, p başlatmak için bu başlatıcının değeri kullanılır."
Aşağıdaki işlev tanımını ve çağrılarını göz önünde bulundurun:
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 [switch] tür kısıtlaması
Anahtar parametresi geçirildiğinde, komuttaki ilgili parametre tür anahtarı tarafından kısıtlanmalıdır. Tür anahtarının True ve False olarak iki değeri vardır.
Aşağıdaki işlev tanımını ve çağrılarını göz önünde bulundurun:
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 İşlem hatları ve işlevleri
İşlem hattında bir betik, işlev veya filtre kullanıldığında, bu betik veya işleve bir değer koleksiyonu teslim edilir. Betik, işlev veya filtre, bu betiğin, işlevin veya filtrenin girişinde tanımlanan numaralandırıcı $input (§2.3.2.2, §4.5.16) aracılığıyla koleksiyona erişir.
Aşağıdaki işlev tanımını ve çağrılarını göz önünde bulundurun:
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 Adlandırılmış bloklar
betik bloğu içindeki deyimler büyük bir adlandırılmamış bloğa ait olabilir veya bir veya daha fazla adlandırılmış bloka dağıtılabilir. Adlandırılmış bloklar, işlem hatlarından gelen koleksiyonların özel işlenmesine olanak sağlar; adlandırılmış bloklar herhangi bir sırada tanımlanabilir.
içindeki bir 'başlayan blok' (yani; 'begin' anahtar sözcüğüyle işaretlenmiş) içindeki deyimler, ilk işlem hattı nesnesi teslim edilmeden önce bir kez yürütülür.
Her teslim edilen işlem hattı nesnesi için, süreç bloğu (anahtar sözcük "process" ile işaretlenmiş olan) içindeki deyimler yürütülür. ($_ işlem hattından gelen giriş koleksiyonundan işlenen geçerli nesneye erişim sağlar.) Bu, işlem hattı aracılığıyla sıfır öğeden oluşan bir koleksiyon gönderilirse işlem bloğunun hiç yürütülmediği anlamına gelir. Ancak, betik veya işlev bir işlem hattı bağlamı dışında çağrılırsa, bu blok tam olarak bir kez yürütülür ve geçerli koleksiyon nesnesi olmadığından $_$nullolarak ayarlanır.
sonlandırma bloğu (anahtar sözcük ile işaretlenmiş) içindeki ifadeler, en son işlem hattı nesnesi teslim edildikten sonra bir kez yürütülür.
8.10.8 dinamikparam bloğu
§8.10 alt bölümleri, kaynak kodun bir parçası olarak tanımlanan statik parametreleriyle ilgilenir. Başka bir adlandırılmış blok biçimi (§8.10.7) olan dynamicparam bloğukullanılarak, anahtar sözcüğüyle işaretlenen dynamicparam tanımlamak da mümkündür. Bu makinelerin çoğu uygulama tarafından tanımlanmıştır.
Dinamik parametreler, yalnızca belirli koşullar altında kullanılabilen cmdlet, işlev, filtre veya betiğin parametreleridir. Bu tür durumlardan biri, cmdlet'in Set-Item parametresidir.
ifade bloğu'de, bir işlevde parametrenin kullanılabilir olduğu koşulları belirtmek için bir if ifadesi kullanın.
New-Object cmdlet'ini kullanarak parametreyi temsil etmek üzere uygulama tanımlı türde bir nesne oluşturun ve adını belirtin. Ayrıca, parametresinin uygulama tanımlı özniteliklerini temsil etmek üzere farklı bir uygulama tanımlı türde bir nesne oluşturmak için New-Object kullanın.
Aşağıdaki örnekte Ad ve Yol adlı standart parametrelere ve DP1adlı isteğe bağlı dinamik parametreye sahip bir işlev gösterilmektedir.
DP1 parametresi PSet1 parametre kümesindedir ve Int32türüne sahiptir.
DP1 parametresi, Sample işlevinde yalnızca Path parametresinin değeri HKEY_LOCAL_MACHINE kayıt defteri sürücüsünde kullanıldığını belirten "HKLM:" içerdiğinde kullanılabilir.
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
}
}
}
Dinamik parametreyi temsil eden bir nesne oluşturmak için kullanılan tür System.Management.Automation.RuntimeDefinedParameter.
parametresinin özniteliklerini temsil eden bir nesne oluşturmak için kullanılan tür System.Management.Automation.ParameterAttribute.
parametresinin uygulama tanımlı öznitelikleri Zorunlu, Positionve ValueFromPipelineiçerir.
8.10.9 param bloğu
param-block, parametreleri bildirmenin alternatif bir yolunu sağlar. Örneğin, aşağıdaki parametre bildirim kümeleri eşdeğerdir:
function FindStr1 ([string]$Str, [int]$StartPos = 0) { ... }
function FindStr2 {
param ([string]$Str, [int]$StartPos = 0) ...
}
parametre bloğu, parametre bloğu üzerinde öznitelik listesine izin verirken, fonksiyon-parametre-beyanı vermez.
Bir betik param-block içerebilir ancak fonksiyon-parametre-beyanıiçermeyebilir. İşlev veya filtre tanımının function-parameter-declaration veya param-blockolabilir, ancak her ikisi bir arada olamaz.
Aşağıdaki örneği göz önünde bulundurun:
param ( [Parameter(Mandatory = $true, ValueFromPipeline=$true)]
[string[]] $ComputerName )
Belirtilen parametre $ComputerName, string[]türündedir, zorunludur ve işlem hattından veri alır.
Parametre özniteliğinin tartışması ve daha fazla örnek için bkz. §12.3.7.
8.11 Paralel deyim
Sözdizimi:
parallel-statement:
*parallel* statement-block
Paralel deyimi, uygulama tanımlı bir şekilde yürütülen sıfır veya daha fazla deyim içerir.
Paralel deyime yalnızca bir iş akışında izin verilir (§8.10.2).
8.12 Sıra ifadesi
Sözdizimi:
sequence-statement:
*sequence* statement-block
Sequence deyimi, uygulama tarafından belirlenen bir şekilde yürütülebilecek sıfır veya daha fazla deyim içerir.
Sıralı deyime yalnızca bir iş akışında izin verilir (§8.10.2).
8.13 İnline script deyimi
Sözdizimi:
inlinescript-statement:
inlinescript statement-block
inlinescript deyimi, yürütülmesi uygulama tarafından belirlenen bir şekilde sıfır veya daha fazla deyim içerir.
Satır içi komut dosyası deyimine yalnızca bir iş akışında izin verilir (§8.10.2).
8.14 Parametre bağlama
Betik, işlev, filtre veya cmdlet çağrıldığında, her bağımsız değişken konuma göre karşılık gelen parametreye bağlanabilir ve ilk parametre sıfır konumuna sahip olur.
Get-Poweradlı bir işlev için aşağıdaki tanım parçasını ve buna yapılan çağrıları göz önünde bulundurun:
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
Betik, işlev, filtre veya cmdlet çağrıldığında, bağımsız değişken ada göre ilgili parametreye bağlanabilir. Bu işlem, başında tire (-) olan parametre adını ve ardından bu bağımsız değişkenin ilişkili değerini içeren bağımsız değişkeniyle birparametresi kullanılarak yapılır. Kullanılan parametre adı büyük/küçük harfe duyarlı olmayan herhangi bir yazım denetimine sahip olabilir ve ilgili parametreyi benzersiz olarak tanımlayan herhangi bir ön ek kullanabilir. Parametre adlarını seçerken, ortak parametrelerin adlarını kullanmaktan kaçının.
Get-Powerişlevi için aşağıdaki çağrıları göz önünde bulundurun:
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
Öte yandan, aşağıdaki işleve çağrı yapar
function Get-Hypot ([double]$Side1, [double]$Side2) {
return [Math]::Sqrt($Side1 * $Side1 + $Side2 * $Side2)
}
-Side1 ve -Side2parametrelerini kullanmalıdır. Parametreyi benzersiz olarak tanımlayan bir ön ek yoktur.
Aynı parametre adı, farklı ilişkili bağımsız değişken değerleriyle veya bağımsız değişken değerleri olmadan birden çok kez kullanılamaz.
Parametrelerin öznitelikleri olabilir (§12). Tek tek öznitelikler hakkında bilgi için §12.3içindeki bölümlere bakın. Parametre kümeleri hakkında bilgi için bkz. §12.3 .7.
Betik, işlev, filtre veya cmdlet, çağırma komut satırı aracılığıyla, işlem hattından veya her ikisinden bağımsız değişkenler alabilir. Parametre bağlamasını çözümlemeye yönelik adımlar aşağıdadır:
- Önce tüm adlandırılmış parametreleri bağlayın, ardından
- Konumsal parametreleri bağlayın ve ardından
- İşlem hattından değere (§12.3.7) tam eşleşme ile bağlayın, ardından
- Ardından, işlem hattından değere dönüştürerek (§12.3.7) bağlayın.
- İşlem hattından ada göre (§12.3.7) tam eşleşme ile bağlayın, ardından
- İşlem hattından ada (§12.3.7) dönüştürme ile bağlama
Bu adımlardan birkaçı, §6'da açıklandığı gibi dönüştürmeyi içerir. Ancak, bağlamada kullanılan dönüştürme kümesi, dil dönüştürmelerinde kullanılanla tam olarak aynı değildir. Özellikle
-
$nulldeğeri bool olarak kullanılabilir, ancak$null,bool'ye bağlanamaz. -
$nulldeğeri bir cmdlet için switch parametresine geçirildiğinde,$truegeçirildi gibi kabul edilir. Ancak, bir işlev için switch parametresine geçirildiğinde,$falsegeçirildi gibi kabul edilir. - Bool veya switch türündeki parametreler yalnızca sayısal veya bool türündeki bağımsız değişkenlere bağlanabilir.
- Parametre türü bir koleksiyon değilse, ancak bağımsız değişken bir tür koleksiyonsa, parametre türü object veya PsObject olmadığı sürece dönüştürme işlemi yapılmaz. (Bu kısıtlamanın temel noktası, bir koleksiyonun dize parametresine dönüştürülmesini reddetmektir.) Aksi takdirde, normal dönüştürmeler deneniyor.
Parametre türü IList veya ICollection<T>ise yalnızca Oluşturucu, op_Implicit ve op_Explicit aracılığıyla yapılan dönüştürmeler deneniyor. Böyle bir dönüştürme yoksa, IList, ICollection<T>ve dizileri içeren "koleksiyon" türü parametreleri için özel bir dönüştürme kullanılır.
Konumsal parametreler, mümkünse tür dönüştürme olmadan bağlanmayı tercih eder. Örneğin
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"
PowerShell