8. Deyimler

8.1 Deyim blokları ve listeleri

Söz dizimi:

İpucu

~opt~ Söz dizimi tanımlarındaki gösterimi, söz diziminde sözcük temelli 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ümcede aksi belirtilmedikçe deyimler sözcük düzeninde yürütülür.

Deyim bloğu, bir deyim kümesinin tek bir söz dizimsel birimde gruplandırılmasına olanak tanır.

8.1.1 Etiketli deyimler

Söz dizimi:

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 önce bir deyim etiketi , etiket olabilir. Deyim etiketi, kesme (§8.5.1) veya continue (§8.5.2) deyiminin isteğe bağlı hedefi olarak kullanılır. Ancak, bir etiket denetim akışını değiştirmez.

İki nokta üst üste (:) ile onu izleyen belirteç arasında boşluk olması yasaktır.

Ö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 Deyimi değerleri

Deyimin değeri, işlem hattına yazdığı birikmeli değer kümesidir. deyimi tek bir skaler değer yazarsa, bu deyiminin değeridir. deyimi birden çok değer yazarsa, deyiminin değeri, kısıtlanmamış bir 1 boyutlu dizinin öğelerinde depolanan değerler kümesinin yazıldıkları sırayla olmasıdır. Aşağıdaki örneği inceleyin:

$v = for ($i = 10; $i -le 5; ++$i) { }

Döngü yinelemesi yoktur ve işlem hattına hiçbir şey yazılmamıştır. deyiminin değeridir $null.

$v = for ($i = 1; $i -le 5; ++$i) { }

Döngü beş kez yinelese de işlem hattına hiçbir şey yazılmamıştır. deyiminin değeri $null.

$v = for ($i = 1; $i -le 5; ++$i) { $i }

döngü, işlem hattına int değerini $iher yazışında beş kez yinelenir. deyiminin değeri Uzunluk 5'tir object[] .

$v = for ($i = 1; $i -le 5; ) { ++$i }

Döngü beş kez yinelese de işlem hattına hiçbir şey yazılmamıştır. deyiminin değeridir $null.

$v = for ($i = 1; $i -le 5; ) { (++$i) }

Döngü, her değerin işlem hattına yazılmasıyla beş kez yinelenir. deyiminin değeri Uzunluk 5'tir object[] .

$i = 1; $v = while ($i++ -lt 2) { $i }

Döngü bir kez yinelenir. deyiminin değeri, değeri 2 olan değeridir int .

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 İşlem hattı deyimleri

Söz dizimi:

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önlendirmeler §7.12'de ele alındı; atama-ifadesi ,7.11'de tartışılır; ve command-invocation-operator nokta (.) §3.5.5'te açıklandı. Komut çağrılarında bağımsız değişkenden parametreye eşlemenin tartışması için bkz. §8.14.

İşlem hattındaki ilk komut bir ifade veya komut çağırmadır. Genellikle, komut çağrısı genellikle çıplak tanımlayıcı olan bir komut adıyla başlar. command-elements , 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. Bağımsız değişkenleri 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. Harf büyük/küçük harf korunur.

  • Değişken değiştirme ve alt ifade genişletmesi (§2.3.5.2), genişletilebilir-dize-değişmez-değerleri ve genişletilebilir-here-string-literal s içinde gerçekleşir.

  • Tırnak işaretleri içindeki metin, bağımsız değişkenin değerine baştaki, sondaki ve eklenmiş boşlukların eklenmesini sağlar. [Not: Tırnak içinde bir bağımsız değişkende boşluk bulunması tek bir bağımsız değişkeni birden çok bağımsız değişkene dönüştürmez. son not]

  • Bağımsız değişkenin etrafına parantezler koymak, bu ifadenin özgün ifadenin metni yerine geçirilen sonuçla birlikte değerlendirilmesine neden olur.

  • Anahtar parametresine (§2.3.4) benzeyen ancak böyle 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.

  • Tür kısıtlamasına (§8.10.5) sahip [switch] 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 varlığı bu parametrenin olarak ayarlanmasına $trueneden olur. Ancak parametrenin değeri, bağımsız değişkenine bir sonek eklenerek açıkça ayarlanabilir. Örneğin, türü kısıtlanmış bir p parametresi verildiğinde, bir bağımsız değişkeni p'yi -p:$true True olarak ayarlarken -p:$false p'yi False olarak ayarlar.

  • bağımsız değişkeni -- , bunu izleyen tüm bağımsız değişkenlerin, çevrelerine çift tırnak yerleştirilmiş gibi gerçek biçimlerinde geçirileceklerini gösterir.

  • bağımsız değişkeni --% , bunu izleyen tüm bağımsız değişkenlerin en az ayrıştırma ve işleme ile geçirilmeye çalışıldığını gösterir. Bu bağımsız değişkene verbatim parametresi adı verilir. Verbatim parametresinden 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 --% komutuna geçirilir. Sonrasındaki bağımsız değişkenlerin --% ortam değişkenleri (dizeler ile %çevrelenmiştir) genişletilmiştir. Örnek:

echoargs.exe --% "%path%" # %path% is replaced with the value $env:path

Bağımsız değişkenlerin değerlendirme sırası belirtilmemiştir.

Parametre bağlama hakkında bilgi için bkz . §8.14. Ad araması hakkında daha fazla 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ının hemen ardından 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ını ve ardından herhangi bir bağımsız değişkeni kullanarak ç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, bir komut çağrısının Get-Factorial aşağıdaki çağrıları 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öz dizimi:

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:

İşlem hattı denetim ifadeleri bool türüne sahip olmalı veya örtük olarak bu türe 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ümcesi olabilir.

Üst düzey işlem hattı True'yu test ederse , deyiminin deyimi-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 ederse , deyiminin 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, deyimi-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öz dizimi:

while-statement:
    while new-lines~opt~ ( new-lines~opt~ while-condition new-lines~opt~ ) statement-block

while-condition:
    new-lines~opt~ pipeline

Açıklama:

While-condition denetim ifadesi bool türünde olmalı veya örtük olarak bu türe dönüştürülebilir olmalıdır. Deyim bloğundan oluşan döngü gövdesi, denetim ifadesi False'u test edene kadar art arda 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öz dizimi:

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:

While-condition denetim ifadesi bool türünde olmalı veya örtük olarak bu türe dönüştürülebilir olmalıdır. while biçiminde, deyim bloğundan oluşan döngü gövdesi, denetim ifadesi True'yu test ederken art arda yürütülür. Until formunda, denetim ifadesi True'yu test edene kadar döngü gövdesi tekrar tekrar 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öz dizimi:

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 ifadesinin bool türü olmalıdır veya örtük olarak bu türe dönüştürülebilir olmalıdır. Deyim bloğundan oluşan döngü gövdesi, denetim ifadesi True'yu test ederken art arda yürütülür. Denetim ifadesi, döngü gövdesinin her yürütülmesinden önce değerlendirilir.

For-initializer ifadesi, denetim ifadesinin ilk değerlendirmesinden önce değerlendirilir. for-initializer ifadesi yalnızca yan etkileri için değerlendirilir; ürettiği herhangi bir değer atılır ve işlem hattına yazılmaz.

Yineleyici için ifade, döngü gövdesinin her yürütülmesinden sonra değerlendirilir. Yineleyici 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.

For-condition ifadesi atlanırsa, denetim ifadesi True değerini 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öz dizimi:

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:

deyim bloğundan oluşan döngü gövdesi, işlem hattı tarafından belirlenen koleksiyondaki değişken değişkeni tarafından belirlenen her öğe için yürütülür. Değişkenin kapsamı foreach deyimiyle sınırlı değildir. Bu nedenle, döngü gövdesinin yürütülmesi tamamlandıktan sonra son değerini korur. İşlem hattı bir koleksiyon yerine bir skaler ($null değeri hariç) atarsa, bu skaler bir öğenin koleksiyonu olarak değerlendirilir. İşlem hattı değerini $nulltanımlarsa , işlem hattı sıfır öğe koleksiyonu olarak değerlendirilir.

foreach-parameter -parallel belirtilirse, davranış uygulama tanımlıdır.

foreach-parametresine ‑parallel yalnızca bir iş akışında izin verilir (§8.10.2).

Her foreach deyiminin $foreach yalnızca bu döngü yürütülürken var olan kendi numaralandırıcısı (§2.3.2.2, §4.5.16) vardır.

İşlem hattı tarafından üretilen nesneler , deyim bloğu yürütülmeye başlamadan önce toplanır. Ancak , ForEach-Object cmdlet'iyle, her nesnede deyim bloğu oluşturulurken 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 Flow denetim deyimleri

Söz dizimi:

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 Break deyimi

Açıklama:

Etiket-ifadesi içeren bir kesme deyimi etiketli kesme deyimi olarak adlandırılır. Etiket-ifadesi olmayan bir kesme deyimi etiketsiz kesme deyimi olarak adlandırılır.

Bir yakalama deyiminin dışında, etiketsiz bir kesme deyimi doğrudan yineleme deyimi (§8.4) içinde bu en küçük kapsayan yineleme deyiminin yürütülmesini sonlandırır. Etiketsiz bir kesme deyimi doğrudan switch deyiminin (§8.6) içinde geçerli anahtarın anahtar koşulu için desen eşleştirmeyi sonlandırır. Yakalama deyiminden kesme kullanma ayrıntıları için bkz. (§8.8).

İsteğe bağlı olarak bir yineleme deyimi veya switch deyiminin önünde bir deyim etiketi (§8.1.1) bulunabilir. Böyle bir deyim etiketi etiketli bir kesme 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 için arama betik ve işlev çağrısı sınırları arasında bile çağrı yığınını devam edebilir. Eşleşen etiket bulunmazsa, geçerli komut çağırma sonlandırılır.

Etiket ifadesi tarafından belirlenen etiketin adının sabit bir değere sahip olması gerekmez.

Etiket-ifadesi birli ifadeyse, 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 Etiket ifadesi içeren bir deyim, etiketli continue deyimi olarak adlandırılır. Etiket-ifadesi olmayan bir continue deyimi etiketsiz continue deyimi olarak adlandırılır.

Yakalama deyiminin içinden kullanımı continue §8.8'de ele alındı.

Döngü içindeki etiketsiz continue bir deyim geçerli döngünün yürütülmesini sonlandırır ve denetimi en küçük kapsayan yineleme deyiminin (§8.4) kapanış ayracına aktarır. Anahtar içindeki etiketsiz continue bir deyim, geçerli switch yinelemenin yürütülmesini sonlandırır ve denetimi en küçük kapsayan switchanahtar koşuluna (§8.6) aktarır.

Bir yineleme deyimi veya deyimi switch (§8.6) isteğe bağlı olarak hemen bir deyim etiketi (§8.1.1) ile önce gelebilir. Böyle bir deyim etiketi, kapalı etiketli continue bir deyimin 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 deyim etiketine aktarır.

Etiketli continue bir işlemin herhangi bir yerel kapsamda çözümlenmesi gerekmez; eşleşen bir etiket için yapılan arama, betik ve işlev çağrısı sınırları arasında bile çağrı yığınını yukarı çekebilir continue . Eşleşen etiket bulunmazsa, geçerli komut çağırma sonlandırılır.

Etiket ifadesi tarafından belirlenen etiketin adının sabit bir değere sahip olması gerekmez.

Etiket-ifadesi birli ifadeyse, 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 deyimi

Açıklama:

Özel durum, sistem veya uygulama düzeyi hata koşulunu işlemenin bir yoludur. throw deyimi bir özel durum oluşturur. (Özel durum işlemenin tartışması için bkz . §8.7 .)

İşlem hattı atlanırsa ve throw deyimi catch-yan tümcesinde değilse, davranış uygulama tanımlıdır. İşlem hattı varsa ve throw deyimi bir catch-yan tümcesindeyse, catch-yan tümcesi ile ilişkili herhangi bir finally yan tümcesi yürütüldükten sonra bu catch-yan tümcesi tarafından yakalanan özel durum yeniden oluşturulur.

İşlem hattı varsa, oluşan özel durumun türü uygulama tanımlıdır.

Bir özel durum oluşturulduğunda, denetim özel durumu işleyebilen bir kapsayan try deyimindeki ilk catch yan tümcesine aktarılır. Başlangıçta özel durumun oluşturulduğu konum , atma noktası olarak adlandırılır. Özel durum oluşturulduktan sonra, özel durumla eşleşen bir catch yan tümcesi bulunana veya bulunabilene kadar §8.7'de açıklanan adımlar art arda izlenir.

Örnekler:

throw
throw 100
throw "No such record in file"

İşlem hattı atlanırsa ve throw deyimi bir catch-yan tümcesinin içinden değilse, "ScriptHalted" metni işlem hattına yazılır ve oluşturulan özel durumun türü olurSystem.Management.Automation.RuntimeException.

İşlem hattı varsa, oluşturulan özel durum türündeki System.Management.Automation.RuntimeExceptionbir nesneye sarmalanır ve bu nesneyle ilgili bilgileri bir System.Management.Automation.ErrorRecord nesne olarak içerir (aracılığıyla $_erişilebilir).

Örnek 1: throw 123 RuntimeException türünde bir özel durumla sonuçlanmaktadır. Catch bloğunun içinden, $_.TargetObject içinde sarmalanan nesneyi içerir, bu örnekte değeri 123 olan bir System.Int32 .

Örnek 2: throw "xxx" RuntimeException türünde bir özel durumla sonuçlanmaktadır. Catch bloğunun içinden, $_.TargetObject içinde sarmalanan nesneyi içerir, bu durumda "xxx" değerine sahip bir System.String .

Örnek 3: throw 10,20 RuntimeException türünde bir özel durumla sonuçlanmaktadır. Catch bloğunun içinden, $_.TargetObject içinde sarmalanan nesneyi içerir. Bu durumda, System.Object[]ile Systemiki öğeden oluşan kısıtlanmamış bir dizisidir. Int32' 10 ve 20 değerleri.

8.5.4 Return deyimi

Açıklama:

deyimi, return 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 deyime sahip olabilir.

Yürütme bir işlevin kapanış ayracına ulaşırsa işlem hattı olmadan zımni return varsayılır.

deyimi return , programcıların kendilerini diğer dillerde olduğu gibi ifade etmelerini sağlamak için biraz "sözdizimsel şekerdir" ancak işlevden veya betikten döndürülen değer aslında söz konusu işlev veya betik tarafından işlem hattına yazılan değerlerin tümü ve işlem hattı tarafından belirtilen tüm değerlerdir. İş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
}

Çağıran Get-Factorial bir geri intalı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
}

Çağıran Test , üç öğeden oluşan kısıtlanmamış 1 boyutlu bir diziyi geri alır.

8.5.5 Exit deyimi

Açıklama:

exit deyimi geçerli betiği sonlandırır ve konak ortamına veya çağrı betiğine denetim ve çıkış kodu döndürür. İşlem hattı sağlanırsa, belirtmiş olduğu değer gerekirse int'e dönüştürülür. Böyle bir dönüştürme yoksa veya işlem hattı atlanırsa, int değeri sıfır döndürülür.

Örnekler:

exit $count # terminate the script with some accumulated count

8.6 Switch deyimi

Söz dizimi:

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 bir anahtar yan tümcesi) veya anahtar sözcükle default (varsayılan anahtar yan tümcesi) başlayan bir veya daha fazla switch yan tümcesi içermelidir. Bir anahtar sıfır veya bir default switch yan tümcesi ve sıfır veya daha fazla varsayılan olmayan switch yan tümcesi içermelidir. Switch yan tümceleri herhangi bir sırayla yazılabilir.

Birden çok desen aynı değere sahip olabilir. Desenin değişmez değer olması gerekmez ve bir anahtarın farklı türlerde desenleri olabilir.

Switch-condition değeri bir desen değeriyle eşleşiyorsa, bu desenin deyim bloğu yürütülür. Anahtar koşulunun değeriyle birden çok desen değeri eşleşiyorsa, bu deyim bloğundan herhangi biri bir break deyim (§8.5.1) içermediği sürece eşleşen her desenin deyim bloğu sözcük düzeninde yürütülür.

Switch-condition değeri herhangi bir desen değeriyle eşleşmiyorsa, bir default switch yan tümcesi varsa , deyimi bloğu yürütülür; aksi takdirde, bu anahtar koşulu için desen eşleştirme sonlandırılır.

Anahtarlar, her anahtarın kendi anahtar yan tümceleri kümesine sahip olacak şekilde iç içe geçmiş olabilir. Böyle durumlarda, switch yan tümcesi şu anda kapsamda olan en içteki anahtara aittir.

Her deyim bloğuna girişte, $_ denetimin bu deyim bloğuna gitmesine neden olan anahtar koşulunun değeri otomatik olarak atanır. $_ bu deyimin switch-clause-koşulunda da kullanılabilir.

Dize olmayanların eşleşmesi, eşitlik testi (§7.8.1) ile yapılır.

Eşleştirme dizeleri içeriyorsa, varsayılan olarak karşılaştırma büyük/küçük harfe duyarlı değildir. switch-parameter'ın -casesensitive varlığı, karşılaştırma 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 switch-parameter -joker karakter varsa. Varsayılan olarak, karşılaştırma büyük/küçük harfe duyarlı değildir.

Bir desen normal bir ifade (§3.16) içerebilir; bu durumda, normal ifade dizesi karşılaştırmaları gerçekleştirilir, ancak yalnızca switch-parametresi -regex varsa. Varsayılan olarak, karşılaştırma büyük/küçük harfe duyarlı değildir. varsa -regex ve bir desen eşleşiyorsa, $matches bu desen için switch-clause statement-block içinde tanımlanır.

Switch-parameter kısaltılabilir; bir parametrenin herhangi bir benzersiz baştaki bölümü kullanılabilir. Örneğin, ‑regex, ‑rege, ‑reg, ‑reve ‑r eşdeğerdir.

Çakışan switch-parameter'lar belirtilirse sözcük temelli son değer geçerli olur. ancak ve -wildcardöğelerinin ‑exact -regex varlığı üzerinde hiçbir etkisi ‑caseyoktur.

switch-parameter ‑parallel belirtilirse, davranış uygulama tanımlıdır.

Switch-parameter ‑parallel yalnızca bir iş akışında (§8.10.2) izin verilir.

Desen bir script-block-ifadesiyse, bu blok değerlendirilir ve gerekirse sonuç bool'a dönüştürülür. Sonuç değerine $truesahipse, karşılık gelen deyim bloğu yürütülür; aksi takdirde yürütülmemiştir.

Anahtar koşulu birden çok değer belirlerse anahtar, tek bir değer belirten bir anahtar koşulu için yukarıda açıklanan kurallar kullanılarak her değere sözcük temelli sırayla uygulanır. Her switch deyiminin $switch yalnızca bu anahtar yürütülürken var olan kendi numaralandırıcısı (§2.3.2.2, §4.5.16) vardır.

Switch deyiminin etiketi olabilir ve etiketli ve etiketsiz kesme (§8.5.1) ve devam (§8.5.2) deyimleri içerebilir.

Switch-condition switch-filename ise-file, bir ifadedeki değerleri yinelemek yerine anahtar, switch-filename tarafı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 deyimi

Söz dizimi:

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.3'te açıklanmıştır.

Try bloğu, try deyimiyle ilişkilendirilmiş deyim bloğudur. Catch bloğu, catch-yan tümcesiyle ilişkilendirilmiş deyim bloğudur. Finally bloğu, finally-yan tümcesiyle ilişkilendirilmiş deyim bloğudur.

Catch-type-list içermeyen catch-yan tümcesi genel catch yan tümcesi olarak adlandırılır.

Her catch-yan tümcesi bir özel durum işleyicisi ve catch-type-list değeri yükseltilmiş özel durumun türünü içeren bir catch-yan tümcesi eşleşen bir catch yan tümcesidir. Genel catch yan tümcesi tüm özel durum türleriyle eşleşir.

catch-yan tümceleri ve finally-yan tümcesi isteğe bağlı olsa da, bunlardan en az birinin mevcut olması gerekir.

Atılan bir özel durumun işlenmesi, özel durumla eşleşen bir catch yan tümcesi bulunana kadar aşağıdaki adımların art arda değerlendirilmesini içerir.

  • Geçerli kapsamda, atma noktasını kapsayan her try deyimi incelenir. Her try deyimi S için, en içteki try deyiminden başlayıp en dış try deyimiyle biten aşağıdaki adımlar değerlendirilir:

    • try S bloğu oluşturma noktasını kapsıyorsa ve S'nin bir veya daha fazla catch yan tümcesi varsa, catch yan tümceleri özel durum için uygun bir işleyici bulmak üzere sözcük temelli olarak incelenir. Özel durum türünü veya özel durum türünün temel türünü belirten ilk catch yan tümcesi eşleşme olarak kabul edilir. Genel catch yan tümcesi, herhangi bir özel durum türü için eşleşme olarak kabul edilir. Eşleşen bir catch yan tümcesi bulunursa, denetimi bu catch yan tümcesinin bloğuna aktararak özel durum işleme tamamlanır. Eşleşen bir catch yan tümcesi içinde değişken $_ geçerli özel durumun açıklamasını içerir.

    • Aksi takdirde, try S bloğu veya bir catch blok atma noktasını içine alırsa ve S'nin bir finally bloğu varsa, denetim finally bloğuna aktarılır. finally Blok başka bir özel durum oluşturursa geçerli özel durumun işlenmesi sonlandırılır. Aksi takdirde, denetim bloğun finally sonuna ulaştığında geçerli özel durumun işlenmesine devam edilir.

  • Geçerli kapsamda bir özel durum işleyicisi bulunmadı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şlemenin, özel durum için işleyici olmadığını belirten tüm kapsamları sonlandırması durumunda davranış belirtilmez.

Bir try bloğunda ulaşılamayan catch yan tümcelerini önlemek için, catch yan tümcesi aynı try bloğundaki önceki catch yan tümcesinde belirtilen türe eşit veya türetilmiş bir özel durum türü belirtmeyebilir.

Denetim bir deyimden ayrıldığında her zaman bir finally try bloğun deyimleri yürütülür. Denetim aktarımının normal yürütmenin bir sonucu olarak, bir , continueveya deyiminin yürütülmesinin breaksonucu olarak ya da return deyiminden try bir özel durumun oluşması sonucu olarak gerçekleşip gerçekleşmediği doğrudur.

Bir bloğun yürütülmesi sırasında bir finally özel durum oluşturulursa, özel durum bir sonraki kapsayan try deyime atılır. İşlenme sürecinde başka bir özel durum varsa, bu özel durum kaybolur. Deyimin açıklamasında özel durum oluşturma işlemi daha ayrıntılı olarak ele alınıyor throw .

try deyimleri deyimlerle trap 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 {
        # ...
    }
}

Oluşan her özel durum olarak System.Management.Automation.RuntimeExceptionoluşturulur. Blokta try türe özgü catch-yan tümcesi varsa, yukarıdaki tür System.IndexOutOfRangeException gibi bir eşleşme bulmak için özel durumun InnerException özelliği incelenir.

8.8 Yakalama deyimi

Söz dizimi:

trap-statement:
    *trap* new-lines~opt~ type-literal~opt~ new-lines~opt~ statement-block

Açıklama:

trap Tür değişmez değeri olan ve olmayan bir deyim, bir deyimin bir kerede yalnızca bir catch türü yakalayabilmesi dışında, sırasıyla catch-type-list içeren ve olmayan bir trap blokla (§8.7) benzer.

Aynı deyim bloğunda birden çok trap deyim tanımlanabilir ve tanım sırası ilgisizdir. Aynı tür değişmez değerine sahip iki trap deyim aynı kapsamda tanımlanırsa, eşleşen türün özel durumunu işlemek için sözcüksel olarak ilk ifade kullanılır.

Bir catch bloğun aksine, deyim trap bir özel durum türüyle tam olarak eşleşir; türetilmiş tür eşleştirmesi yapılmaz.

Bir özel durum oluştuğunda, geçerli kapsamda eşleşen trap bir deyim yoksa, arama betiğine, işleve veya filtreye ve ardından çağıranın içine bakmayı içerebilen kapsayan kapsamda eşleşen bir yakalama deyimi aranabilir. Aramanın, özel durum için işleyici olmadığını belirten tüm kapsamları sonlandırması durumunda davranış belirtilmez.

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 bunun üzerinden geçer.

' traps deyimi gövdesi normal şekilde çıkarsa, varsayılan olarak hata akışına bir hata nesnesi yazılır, özel durum işlenir olarak kabul edilir ve yürütme, özel durumu görünür hale getiren deyimini trap içeren kapsamdaki deyimin hemen ardından deyimiyle devam eder. Özel durumun nedeni, deyimini içeren komutu tarafından çağrılan bir komutta trap olabilir.

' trapnin deyimi gövdesinde yürütülen son deyim devam ederse (§8.5.2), hata nesnesinin hata akışına yazılması gizlenür ve yürütme, özel durumu görünür hale getiren yakalama deyimini içeren kapsamdaki deyimin hemen ardından deyimiyle devam eder. ' trapnin deyim gövdesinde yürütülen son deyim break (§8.5.1) ise hata nesnesinin hata akışına yazılması gizlenip özel durum yeniden oluşturulur.

Deyiminin trap içinde değişken $_ geçerli hatanın açıklamasını içerir.

Bir bloğun içinden try tetiklenen bir özel durumun eşleşen catch bir bloğu olmadığını, ancak daha yüksek blok düzeyinde eşleşen trap bir deyimin mevcut olduğunu düşünün. Bloğun try finally yan tümcesi yürütüldükten sonra, trap herhangi bir üst kapsamda eşleşen catch bir blok olsa bile deyimi denetimi alır. Bir trap deyimi bloğun içinde tanımlanırsa ve bu bloğun try try eşleşen catch bir bloğu varsa, trap deyimi denetimi alır.

Örnekler:

Aşağıdaki örnekte, hata nesnesi yazılır ve yürütme, yakalamaya neden olandan hemen sonra deyimiyle devam eder; yani işlem hattına "Bitti" yazılır.

$j = 0; $v = 10/$j; "Done"
trap { $j = 2 }

Aşağıdaki örnekte, hata nesnesinin yazılması bastırılır ve yürütme, yakalamaya neden olandan hemen sonra deyimiyle devam eder; yani işlem hattına "Bitti" yazılır.

$j = 0; $v = 10/$j; "Done"
trap { $j = 2; continue }

Aşağıdaki örnekte, hata nesnesinin yazılması gizlenip özel durum yeniden oluşturulur.

$j = 0; $v = 10/$j; "Done"
trap { $j = 2; break }

Aşağıdaki örnekte, yakalama 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, yakalama ve özel durum 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öz dizimi:

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 deyimi 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ıtmayı, bulmayı ve işlemeyi kolaylaştırarak uluslararasılaştırmayı desteklemeye yardımcı olur.

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çerecek şekilde sınırlıdır:

  • Dışındaki tüm işleçler -match
  • deyimi if
  • Aşağıdaki otomatik değişkenler: $PsCulture, $PsUICulture, $true, $falseve $null.
  • Yorumlar
  • Pipelines
  • Noktalı virgülle ayrılmış deyimler (;)
  • Değişmez Değerler
  • 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 değişmez değeri biçimi kullanılarak ifade edilebilir. Ancak, genişletilebilir-dize-değişmez-değeri s ve genişletilebilir-burada-dize-değişmez-değeri s herhangi bir değişken değiştirme veya alt ifade genişletmeleri 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ü, ConvertTo-XMLxml dosyasındaki verileri biçimlendiren, kullanı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 değerine atanmış $messagesbir karma tablosuna dönüştüren bir ConvertFrom-StringData komut 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.Yesve $messages.Nokullanılarak $messages.Greetingerişilir.

Şimdi bu, İngilizce dil kaynağı olarak kaydedilebilir. Almanca ve İspanyolca dil 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
"@
}

Dataname varsa, veri deyiminin değerinin depolandığı değişkeni (başta $kullanmadan) adlandırmaktadır. Özel olarak, $name = data { ... } ile data name { ... }eşdeğerdir.

8.10 İşlev tanımları

Söz dizimi:

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:

İş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 içerir.

Her işlev sınıfının System.Management.Automation.FunctionInfobir örneğidir.

8.10.1 Filtre işlevleri

Sıradan bir işlev bir işlem hattında bir kez çalıştırılır ve aracılığıyla $inputgiriş 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ış blokları olmayan bir filtre (§8.10.7), işlem bloğu olan ancak 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 sınıfın System.Management.Automation.FilterInfo 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. İş akışı işlevi, Windows Workflow Foundation etkinlikleri dizisine çevrilir ve Windows Workflow Foundation altyapısında yürütülür.

8.10.3 Bağımsız değişken işleme

adlı Get-Powerbir 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 ve $exponentiki parametresi vardır$base. Ayrıca negatif olmayan üs değerleri için sonucu hesaplayan $base^$exponent^ ve çağırana Get-Powerdöndüren bir deyim 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ğerine 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, değer $null kullanılır. Bu nedenle, her parametre, betik bloğunun başında atama tarafından başlatılmış gibi yeni bir değişkendir.

Betik parametresi bir tür kısıtlaması içeriyorsa (örneğin [long] ve [int] üzeri), ilgili bağımsız değişkenin değeri bu türe dönüştürülür, gerekirse, aksi takdirde dönüştürme gerçekleşmez.

Betik, işlev veya filtre yürütmeye başladığında, değişken $args 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ış 1 boyutlu bir dizi olarak 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 parametresinin bildirimi bir başlatıcı içerebilir; bu durumda, bu başlatıcının değeri p sağlanan p'yi başlatmak için kullanılır, çağrıdaki hiçbir bağımsız değişkene bağlı değildir.

Aşağıdaki işlev tanımını ve çağrılarını göz önünde bulundurun:

function Find-Str ([string]$str, [int]$start_pos = 0) { ... }

Find-Str "abcabc" # 2nd argument omitted, 0 used for $start_pos
Find-Str "abcabc" 2 # 2nd argument present, so it is used for $start_pos

8.10.5 [switch] tür kısıtlaması

Bir switch parametresi geçirildiğinde, komuttaki karşılık gelen parametrenin tür anahtarı tarafından kısıtlanması gerekir. Tür anahtarı iki değere sahiptir: True ve False.

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 Pipelines ve işlevleri

İşlem hattında bir betik, işlev veya filtre kullanıldığında, bir değer koleksiyonu bu betik veya işleve teslim edilir. Betik, işlev veya filtre, bu betik, işlev veya filtreye girişte tanımlanan numaralandırıcı $input (§2.3.2.2, §4.5.16) aracılığıyla bu 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 olarak işlenmesine olanak sağlar; adlandırılmış bloklar herhangi bir sırada tanımlanabilir.

İlk işlem hattı nesnesi teslim edilene kadar bir başlangıç bloğundaki deyimler (örneğin, anahtar sözcüğü begin ile işaretlenmiş olan) bir kez yürütülür.

Bir işlem bloğundaki deyimler (örneğin, anahtar sözcük işlemiyle işaretlenmiş olan) teslim edilen her işlem hattı nesnesi için 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 olarak $nullayarlanır.

Son işlem hattı nesnesi teslim edildikten sonra bir uç bloğundaki deyimler (anahtar sözcük ucuyla işaretlenmiş deyimler) bir kez yürütülür.

8.10.8 dynamicParam bloğu

§8.10 alt bölümleri şu ana kadar kaynak kodun bir parçası olarak tanımlanan statik parametrelerle ilgilenir. Dinamik parametreleri, anahtar sözcüğüyle dynamicParamişaretlenmiş başka bir adlandırılmış blok biçimi (§8.10.7) olan dynamicParam bloğu aracılığıyla tanımlamak da mümkündür. Bu makinelerin çoğu uygulama tanımlıdır.

Dinamik parametreler, yalnızca belirli koşullar altında kullanılabilen cmdlet, işlev, filtre veya betiğin parametreleridir. Böyle bir durum, cmdlet'in Set-Item Kodlama parametresidir.

deyimi-bloğunda, işlevinde parametrenin hangi koşullar altında kullanılabilir olduğunu belirtmek için bir if deyimi 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 eden farklı bir uygulama tanımlı türde bir nesne oluşturmak için kullanın New-Object .

Aşağıdaki örnekte Ad ve Yol adlı standart parametrelere ve DP1 adlı isteğe bağlı dinamik parametreye sahip bir işlev gösterilmektedir. DP1 parametresi PSet1 parametre kümesindedir ve türündedirInt32. DP1 parametresi Sample işlevinde yalnızca Path parametresinin değeri kayıt defteri sürücüsünde kullanıldığını belirten "HKLM:" içerdiğinde HKEY_LOCAL_MACHINE 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 Mandatory, Position ve ValueFromPipeline'i içerir.

8.10.9 param bloğu

Param bloğu, parametreleri bildirmenin alternatif bir yolunu sağlar. Örneğin, aşağıdaki parametre bildirim kümeleri eşdeğerdir:

function FindStr1 ([string]$str, [int]$start_pos = 0) { ... }
function FindStr2 {
    param ([string]$str, [int]$start_pos = 0) ...
}

param-block, param-block üzerinde öznitelik listesine izin verirken , işlev-parametre-bildirimi izin vermez.

Betiğin param bloğu olabilir ancak işlev-parametre-bildirimi olmayabilir. bir işlev veya filtre tanımı işlev-parametre-bildirimine veya param bloğuna sahip olabilir, ancak her ikisi birden olmayabilir.

Aşağıdaki örneği inceleyin:

param ( [Parameter(Mandatory = $true, ValueFromPipeline=$true)]
        [string[]] $ComputerName )

tek parametre türüne $ComputerNamesahiptir string[], gereklidir ve işlem hattından giriş alır.

Parameter özniteliğinin bir tartışması ve daha fazla örnek için bkz. §12.3.7.

8.11 Paralel deyim

Söz dizimi:

parallel-statement:
    *parallel* statement-block

Paralel deyim, 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ıralı deyim

Söz dizimi:

sequence-statement:
    *sequence* statement-block

Sequence deyimi, uygulama tanımlı bir şekilde yürütülen sıfır veya daha fazla deyim içerir.

Bir sıra deyimine yalnızca bir iş akışında izin verilir (§8.10.2).

8.13 Inlinescript deyimi

Söz dizimi:

inlinescript-statement:
    inlinescript statement-block

inlinescript deyimi, uygulama tanımlı bir şekilde yürütülen sıfır veya daha fazla deyim içerir.

Inlinescript deyimine yalnızca bir iş akışında izin verilir (§8.10.2).

8.14 Parametre bağlama

Bir 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.

adlı Get-Powerbir 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şta tire (-) olan parametrenin adı ve ardından bu bağımsız değişkenin ilişkili değeri olan bağımsız değişkene sahip bir parametre kullanılarak gerçekleştirilir. Kullanılan parametre adı büyük/küçük harfe duyarlı olmayan herhangi bir yazım denetimine sahip olabilir ve ilgili parametreyi benzersiz olarak belirten herhangi bir ön ek kullanabilir. Parametre adlarını seçerken , ortak parametrelerin adlarını kullanmaktan kaçının.

işlevi Get-Poweriç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)
}

parametresini -side1 benzersiz olarak atayabilen bir ön ek olmadığından ve -side2parametrelerini kullanmalıdır.

Aynı parametre adı, farklı 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.3 iç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şkenleri alabilir. Parametre bağlamasını çözümlemeye yönelik adımlar sırasıyla aşağıdadır:

  1. Tüm adlandırılmış parametreleri bağlayın ve ardından
  2. Konumsal parametreleri bağlayın ve ardından
  3. İşlem hattından tam eşleşmeli değere (§12.3.7) göre bağlayın, ardından
  4. İşlem hattından değere (§12.3.7) dönüştürme ile bağlanın, ardından
  5. İşlem hattından tam eşleşme ile ada (§12.3.7) göre bağlayın, ardından
  6. İşlem hattından ada göre (§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. Daha ayrıntılı belirtmek gerekirse:

  • Değer $null bool'a $null atanabilir, ancak ile ilişkili boololamaz.
  • Değer $null bir cmdlet'in switch parametresine geçirildiğinde, geçirildi gibi $true kabul edilir. Ancak, bir işlev için switch parametresine geçirildiğinde, geçirildi gibi $false kabul edilir.
  • Bool veya anahtar türü parametreler yalnızca sayısal veya bool bağımsız değişkenlerine 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 ana noktası, bir koleksiyonun dize parametresine dönüştürülmesini reddetmektir.) Aksi takdirde, normal dönüştürmeler deneniyor.

Parametre türü veya ICollection<T>iseIList, 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 , ve dizilerini içeren IList``ICollection<T>"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ürmesi 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"