Sdílet prostřednictvím


about_Script_Blocks

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-CommandScriptBlock 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
    

Viz také