about_Script_Blocks
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. Samlingen med instruktioner kan omges av klammerparenteser ({}
), definieras som en funktion eller sparas i en skriptfil. Ett skriptblock kan returnera värden och acceptera parametrar och argument.
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>
}
Kommentar
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. Exemplet nedan lagrar ett skriptblock i en variabel och skickar det 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.
Som 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 angiven parameter som accepterar pipelineindata möjliggör användning av fördröjningsbindningsskriptblock på parametern. Du kan använda skriptblock med fördröjningsbindning som en förkortning för att definiera parametrar för en pipelined cmdlet innan du kör den.
I skriptblocket för fördröjningsbindning kan du referera till det pipade objektet med hjälp av pipelinevariabeln $_
.
# 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)" }
I mer komplexa cmdletar tillåter block med fördröjningsbindning att återanvända en piped i objektet för att fylla i andra parametrar.
Anteckningar om skriptblock med fördröjningsbindning som parametrar:
Du måste uttryckligen ange alla 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 fel 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