Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Definuje, co je skriptblock, a vysvětluje, jak používat skripty v programovacím jazyce PowerShellu.
Dlouhý popis
V programovacím jazyce PowerShellu je skriptblock 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. Skriptblock může vracet hodnoty a přijímat parametry a argumenty. Scriptblocks vytvoří nový obor pro proměnné.
Syntakticky je skriptblock seznamem příkazů ve složených závorkách, jak je znázorněno v následující syntaxi:
{<statement list>}
Skriptblock 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čuje jiný výstup vrácený z bloku skriptu.
return Klíčové slovo však ukončí blokování 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>
}
Podobně jako funkce můžou skriptovací bloky obsahovat dynamicparam příkaz a beginpříkazy , processa end příkazy. Další informace najdete v tématu about_Functions a about_Functions_Advanced.
Důležité
Ne všechny bloky uzavřené ve složených závorkách jsou skriptovací bloky. Například příkazy ve smyčce for nebo if příkazu jsou uzavřeny do bloku příkazu.
Bloky příkazů nevytvoří nový obor pro proměnné, podporují parametry dalších klíčových slov příkazu.
Použití skriptových bloků
Skriptblock je instance typu System.Management.Automation.ScriptBlockMicrosoft .NET Framework . Příkazy můžou mít hodnoty parametrů scriptblock. Například rutina Invoke-Command má ScriptBlock parametr, který přebírá hodnotu scriptblock, 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 skriptů, 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
Skriptblock 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í skriptů. Následující příklad uloží blok skriptu do proměnné a předá 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 skripty uložené v proměnné.
Operátor volání podobně Invoke-Commandspustí skriptblock v podřízené oblasti. Operátor volání vám může usnadnit používání parametrů s bloky skriptů.
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
Výstup z bloku 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í zpozděných vazeb skriptů s parametry
Zadaný parametr, který přijímá vstup kanálu, umožňuje u parametru použít bloky skriptu vazby zpoždění . Bloky skriptů 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 skriptu vazby zpoždění můžete odkazovat na potrubí 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)" }
Ve složitějších rutinách umožňují bloky skriptů vazby zpoždění opakované použití jednoho kanálu v objektu k naplnění dalších parametrů.
Poznámky k blokům skriptů s vazbou zpoždění jako parametrů:
Je nutné explicitně zadat všechny názvy parametrů, které používáte s bloky skriptů vazby zpoždění.
Parametr nesmí být nezatypovaný a typ parametru nemůže být
[scriptblock]nebo[Object].Pokud použijete blok skriptu vazby 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 scriptblock and there is no input. A scriptblock 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