about_Script_Blocks

Krótki opis

Definiuje blok skryptów i wyjaśnia, jak używać bloków skryptów w języku programowania programu PowerShell.

Długi opis

W języku programowania programu PowerShell blok skryptu jest kolekcją instrukcji lub wyrażeń, które mogą być używane jako pojedyncza jednostka. Kolekcja instrukcji może być ujęta w nawiasy klamrowe ({}), zdefiniowane jako funkcja lub zapisane w pliku skryptu. Blok skryptu może zwracać wartości i akceptować parametry i argumenty.

Składniowo blok skryptu jest listą instrukcji w nawiasach klamrowych, jak pokazano w następującej składni:

{<statement list>}

Blok skryptu zwraca dane wyjściowe wszystkich poleceń w bloku skryptu jako pojedynczy obiekt lub jako tablicę.

Możesz również określić wartość zwracaną przy użyciu słowa kluczowego return . Słowo return kluczowe nie wpływa ani nie pomija innych danych wyjściowych zwracanych z bloku skryptu. Jednak return słowo kluczowe zamyka blok skryptu w tym wierszu. Aby uzyskać więcej informacji, zobacz about_Return.

Podobnie jak funkcje, blok skryptu może zawierać parametry. Użyj słowa kluczowego Param, aby przypisać nazwane parametry, jak pokazano w następującej składni:

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

Uwaga

W bloku skryptu, w przeciwieństwie do funkcji, nie można określić parametrów poza nawiasami klamrowymi.

Podobnie jak funkcje, bloki skryptów mogą zawierać DynamicParamsłowa kluczowe , Begin, Processi End . Aby uzyskać więcej informacji, zobacz about_Functions i about_Functions_Advanced.

Używanie bloków skryptów

Blok skryptu to wystąpienie typu System.Management.Automation.ScriptBlockprogramu Microsoft .NET Framework. Polecenia mogą mieć wartości parametrów bloku skryptu. Na przykład polecenie Invoke-Command cmdlet ma ScriptBlock parametr, który przyjmuje wartość bloku skryptu, jak pokazano w tym przykładzie:

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 może również wykonywać bloki skryptów, które mają bloki parametrów. Parametry są przypisywane według pozycji przy użyciu parametru ArgumentList .

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

Blok skryptu w poprzednim przykładzie używa słowa kluczowego param do utworzenia parametrów $p1 i $p2. Ciąg "First" jest powiązany z pierwszym parametrem ($p1), a ciąg "Second" jest powiązany z ($p2).

Aby uzyskać więcej informacji na temat zachowania argumentlist, zobacz about_Splatting.

Zmienne umożliwiają przechowywanie i wykonywanie bloków skryptów. W poniższym przykładzie blok skryptu jest przechowywany w zmiennej i przekazuje go do Invoke-Commandklasy .

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

Operator wywołania to inny sposób wykonywania bloków skryptów przechowywanych w zmiennej. Podobnie jak Invoke-Command, operator wywołania wykonuje blok skryptu w zakresie podrzędnym. Operator wywołania może ułatwić używanie parametrów z blokami skryptów.

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

Dane wyjściowe z bloków skryptu można przechowywać w zmiennej przy użyciu przypisania.

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

Aby uzyskać więcej informacji na temat operatora wywołania, zobacz about_Operators.

Używanie bloków skryptów powiązania opóźnienia z parametrami

Typowany parametr, który akceptuje dane wejściowe potoku, umożliwia korzystanie z bloków skryptów powiązanych z opóźnieniem w parametrze. Bloki skryptów powiązania opóźnienia można użyć jako skrótu, aby zdefiniować parametry dla polecenia cmdlet potoku przed jego wykonaniem.

W bloku skryptu z opóźnieniem można odwoływać się do potoku w obiekcie przy użyciu zmiennej $_potoku .

# 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)" }

W bardziej złożonych poleceniach cmdlet bloki skryptów powiązania opóźnienia umożliwiają ponowne użycie jednego potoku w obiekcie w celu wypełnienia innych parametrów.

Uwagi dotyczące bloków skryptów powiązania opóźnienia jako parametrów:

  • Należy jawnie określić nazwy parametrów, które są używane z blokami skryptów powiązanych z opóźnieniem.

  • Parametr nie może być nietypowy, a typ parametru nie może być [scriptblock] ani [object].

  • Jeśli używasz bloku skryptu powiązania opóźnienia bez podawania danych wejściowych potoku, zostanie wyświetlony błąd.

    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
    

Zobacz też