Share via


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, 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. 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-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 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
    

Se även

about_Functions

about_Functions_Advanced

about_Operators