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ć DynamicParam
słowa kluczowe , Begin
, Process
i 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.ScriptBlock
programu 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-Command
klasy .
$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