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, Processoch 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-Commandkö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
    

Se även