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 dynamicparam
klíčová slova , begin
, process
a 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.ScriptBlock
Microsoft .NET Framework . Příkazy můžou mít hodnoty parametrů bloku skriptu. Například rutina Invoke-Command
má ScriptBlock
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-Command
spustí 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