Om skriptblock
Kort beskrivning
Definierar vad ett skriptblock är och förklarar hur du använder skriptblock i PowerShell-programmeringsspråket.
Lång beskrivning
I PowerShell-programmeringsspråket är ett skriptblock en samling instruktioner eller uttryck som kan användas som en enda enhet. Ett skriptblock kan acceptera argument och returnera värden.
Syntaktiskt är ett skriptblock en instruktionslista i klammerparenteser, enligt följande syntax:
{<statement list>}
Ett skriptblock returnerar utdata från alla kommandon i skriptblocket, antingen som ett enskilt objekt eller som en matris.
Du kan också ange ett returvärde med hjälp av nyckelordet return
. Nyckelordet return
påverkar eller utelämnar inte andra utdata som returneras från skriptblocket. Nyckelordet return
avslutar dock skriptblocket på den raden. Mer information finns i about_Return.
Precis som med funktioner kan ett skriptblock innehålla parametrar. Använd nyckelordet Param för att tilldela namngivna parametrar enligt följande syntax:
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
Anteckning
I ett skriptblock, till skillnad från en funktion, kan du inte ange parametrar utanför klammerparenteserna.
Precis som funktioner kan skriptblock innehålla nyckelorden DynamicParam
, Begin
, Process
och End
. Mer information finns i about_Functions och about_Functions_Advanced.
Använda skriptblock
Ett skriptblock är en instans av en Microsoft-.NET Framework typ System.Management.Automation.ScriptBlock
. Kommandon kan ha parametervärden för skriptblock. Cmdleten Invoke-Command
har till exempel en ScriptBlock
parameter som tar ett skriptblockvärde, som du ser i det här exemplet:
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
kan också köra skriptblock som har parameterblock.
Parametrar tilldelas efter position med parametern ArgumentList .
Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second
Skriptblocket i föregående exempel använder nyckelordet param
för att skapa parametrar $p1
och $p2
. Strängen "First" är bunden till den första parametern ($p1
) och "Second" är bunden till ($p2
).
Mer information om beteendet för ArgumentList finns i about_Splatting.
Du kan använda variabler för att lagra och köra skriptblock. I exemplet nedan lagras ett skriptblock i en variabel och skickas till Invoke-Command
.
$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status Name DisplayName
------ ---- -----------
Running BITS Background Intelligent Transfer Ser...
Anropsoperatorn är ett annat sätt att köra skriptblock som lagras i en variabel.
Liksom Invoke-Command
kör anropsoperatorn skriptblocket i ett underordnat omfång. Anropsoperatorn kan göra det enklare för dig att använda parametrar med dina skriptblock.
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
Du kan lagra utdata från skriptblocken i en variabel med hjälp av tilldelning.
PS> $a = { 1 + 1}
PS> $b = &$a
PS> $b
2
PS> $a = { 1 + 1}
PS> $b = Invoke-Command $a
PS> $b
2
Mer information om samtalsoperatorn finns i about_Operators.
Använda fördröjningsbindningsskriptblock med parametrar
En typad parameter som accepterar pipelineindata (by Value
) eller (by PropertyName
) möjliggör användning av skriptblock med fördröjningsbindning på parametern.
I skriptblocket för fördröjningsbindning kan du referera till piped i -objektet med hjälp av pipelinevariabeln $_
.
# Renames config.log to old_config.log
dir config.log | Rename-Item -NewName {"old_" + $_.Name}
I mer komplexa cmdletar tillåter skriptblock med fördröjningsbindning återanvändning av en piped i -objekt för att fylla i andra parametrar.
Anteckningar om skriptblock med fördröjningsbindning som parametrar:
Du måste uttryckligen ange eventuella parameternamn som du använder med skriptblock med fördröjningsbindning .
Parametern får inte vara otypad och parameterns typ får inte vara
[scriptblock]
eller[object]
.Du får ett felmeddelande om du använder ett skriptblock med fördröjningsbindning utan att ange pipelineindata.
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