about_Script_Blocks

Krátký popis

Definuje, co je blok skriptu, a vysvětluje, jak používat bloky skriptů v programovacím jazyce PowerShellu.

Dlouhý popis

V programovacím jazyce PowerShellu je blok skriptu kolekcí příkazů nebo výrazů, které lze použít jako jednu jednotku. Kolekce příkazů může být uzavřena ve složených závorkách ({}), definována jako funkce nebo uložena v souboru skriptu. Blok skriptu může vracet hodnoty a přijímat parametry a argumenty.

Blok skriptu je syntakticky seznam příkazů ve složených závorkách, jak je znázorněno v následující syntaxi:

{<statement list>}

Blok skriptu vrátí výstup všech příkazů v bloku skriptu, a to buď jako jeden objekt, nebo jako pole.

Můžete také zadat návratovou hodnotu pomocí klíčového return slova. Klíčové return slovo nemá vliv ani nepotlačí jiný výstup vrácený z bloku skriptu. return Klíčové slovo však ukončí blok skriptu na daném řádku. Další informace najdete v tématu about_Return.

Podobně jako funkce může blok skriptu obsahovat parametry. Pomocí klíčového slova Param přiřaďte pojmenované parametry, jak je znázorněno v následující syntaxi:

{
    Param([type]$Parameter1 [,[type]$Parameter2])
    <statement list>
}

Poznámka:

V bloku skriptu, na rozdíl od funkce, nemůžete zadat parametry mimo složené závorky.

Podobně jako funkce můžou bloky skriptu obsahovat DynamicParamklíčová slova , Begin, Processa End klíčová slova. Další informace najdete v tématu about_Functions a about_Functions_Advanced.

Použití bloků skriptů

Blok skriptu je instance typu System.Management.Automation.ScriptBlockMicrosoft .NET Framework . Příkazy můžou mít hodnoty parametrů bloku skriptu. Například rutina Invoke-CommandScriptBlock parametr, který přebírá hodnotu bloku skriptu, jak je znázorněno v tomto příkladu:

Invoke-Command -ScriptBlock { Get-Process }
Handles  NPM(K)    PM(K)     WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----     ----- -----   ------     -- -----------
999          28    39100     45020   262    15.88   1844 communicator
721          28    32696     36536   222    20.84   4028 explorer
...

Invoke-Command může také spouštět bloky skriptu, které mají bloky parametrů. Parametry jsou přiřazeny umístěním pomocí parametru ArgumentList .

Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second

Blok skriptu v předchozím příkladu používá param klíčové slovo k vytvoření parametrů $p1 a $p2. Řetězec "First" je vázán na první parametr ($p1) a "Second" je vázán ($p2).

Další informace o chování ArgumentList naleznete v tématu about_Splatting.

Proměnné můžete použít k ukládání a spouštění bloků skriptu. Následující příklad ukládá blok skriptu do proměnné a předává ho do Invoke-Command.

$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status   Name               DisplayName
------   ----               -----------
Running  BITS               Background Intelligent Transfer Ser...

Operátor volání je dalším způsobem, jak spouštět bloky skriptu uložené v proměnné. Operátor volání podobně Invoke-Commandspustí blok skriptu v podřízené oblasti. Operátor volání vám může usnadnit používání parametrů s bloky skriptu.

$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First

Výstup z bloků skriptu můžete uložit do proměnné pomocí přiřazení.

PS>  $a = { 1 + 1}
PS>  $b = &$a
PS>  $b
2
PS>  $a = { 1 + 1}
PS>  $b = Invoke-Command $a
PS>  $b
2

Další informace o operátoru volání najdete v tématu about_Operators.

Použití bloků skriptu s vazbou zpoždění s parametry

Zadaný parametr, který přijímá vstup kanálu, umožňuje u parametru používat bloky skriptu s vazbou zpoždění. Bloky skriptu s vazbou zpoždění můžete použít jako zkratku k definování parametrů pro rutinu kanálu před jejím spuštěním.

V rámci bloku skriptu s vazbou zpoždění můžete odkazovat na kanál v objektu pomocí proměnné $_kanálu .

# Both examples rename config.log to old_config.log
# Without delay-binding
dir config.log | ForEach-Object -Process {
  Rename-Item -Path $_ -NewName "old_$($_.Name)"
}
# With delay-binding
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }

V složitějších rutinách bloky skriptu s vazbou zpoždění umožňují opakované použití jednoho kanálu v objektu k naplnění dalších parametrů.

Poznámky k blokům skriptu s vazbou zpoždění jako parametrů:

  • Je nutné explicitně zadat všechny názvy parametrů, které používáte s bloky skriptu se zpožděním vazby.

  • Parametr nesmí být nezatypovaný a typ parametru nemůže být [scriptblock] nebo [object].

  • Pokud použijete blok skriptu s vazbou zpoždění bez zadání vstupu kanálu, zobrazí se chyba.

    Rename-Item -NewName {$_.Name + ".old"}
    
    Rename-Item : Cannot evaluate parameter 'NewName' because its argument is
    specified as a script block and there is no input. A script block cannot
    be evaluated without input.
    At line:1 char:23
    +  Rename-Item -NewName {$_.Name + ".old"}
    +                       ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : MetadataError: (:) [Rename-Item],
          ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,
          Microsoft.PowerShell.Commands.RenameItemCommand
    

Viz také