Megosztás a következőn keresztül:


about_Script_Blocks

Rövid leírás

Meghatározza, hogy mi a szkriptblokk, és elmagyarázza, hogyan használható a szkriptblokkok a PowerShell programozási nyelvben.

Hosszú leírás

A PowerShell programozási nyelvben a szkriptblokk olyan utasítások vagy kifejezések gyűjteménye, amelyek egyetlen egységként használhatók. Az utasítások gyűjteménye kapcsos zárójelekbe ({}), függvényként definiálva, vagy szkriptfájlba menthető. A szkriptblokkok értékeket adnak vissza, és paramétereket és argumentumokat fogadnak el. A szkriptblokkok új hatókört hoznak létre a változókhoz.

A szkriptblokkok szintaktikailag egy kapcsos utasításlista, ahogyan az a következő szintaxisban is látható:

{<statement list>}

A szkriptblokk a szkriptblokk összes parancsának kimenetét adja vissza egyetlen objektumként vagy tömbként.

A return kulcsszóval is megadhat visszatérési értéket. A return kulcsszó nem befolyásolja vagy nem tiltja le a szkriptblokkból visszaadott egyéb kimeneteket. A return kulcsszó azonban kilép a szkriptblokkból ezen a sorban. További információ: about_Return.

A függvényekhez hasonlóan a szkriptblokkok is tartalmazhatnak paramétereket. A param kulcsszóval rendeljen hozzá elnevezett paramétereket, ahogyan az az alábbi szintaxisban is látható:

{
    param ([type]$Parameter1 [,[type]$Parameter2])
    <statement list>
}

A függvényekhez hasonlóan a szkriptblokkok is tartalmazhatják az dynamicparam utasítást és a , processés end az beginutasításokat. További információ: about_Functions és about_Functions_Advanced.

Fontos

A kapcsos zárójelek között nem minden blokk szkriptblokk. Egy ciklus vagy utasítás if parancsai for például egy utasításblokkba vannak zárva. Az utasításblokkok nem hoznak létre új hatókört a változókhoz, támogatják a többi utasítás kulcsszavak paramétereit.

Szkriptblokkok használata

A szkriptblokk egy Microsoft .NET-keretrendszertípus System.Management.Automation.ScriptBlockegy példánya. A parancsok szkriptblokk paraméterértékekkel rendelkezhetnek. A parancsmag például rendelkezik egy ScriptBlock paraméterrel, Invoke-Command amely szkriptblokkértéket vesz fel, ahogyan az ebben a példában látható:

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 paraméterblokkokkal rendelkező szkriptblokkokat is végrehajthat. A paraméterek hely szerint vannak hozzárendelve az ArgumentList paraméterrel.

Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second

Az előző példában szereplő szkriptblokk a param kulcsszó használatával hoz létre paramétereket $p1 és $p2. Az "Első" sztring az első paraméterhez ($p1) van kötve, a "Második" pedig ($p2).

Az ArgumentListviselkedésével kapcsolatos további információkért lásd: about_Splatting.

A szkriptblokkok tárolására és végrehajtására változókat használhat. Az alábbi példa egy szkriptblokkot tárol egy változóban, és átadja a következőnek Invoke-Command: .

$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status   Name               DisplayName
------   ----               -----------
Running  BITS               Background Intelligent Transfer Ser...

A híváskezelő egy másik módszer a változóban tárolt szkriptblokkok végrehajtására. A híváskezelő például Invoke-Commandegy gyermekhatókörben hajtja végre a szkriptblokkot. A híváskezelővel egyszerűbben használhat paramétereket a szkriptblokkokkal.

$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First

A szkriptblokkokból származó kimenetet egy változóban, hozzárendeléssel tárolhatja.

PS>  $a = { 1 + 1}
PS>  $b = &$a
PS>  $b
2
PS>  $a = { 1 + 1}
PS>  $b = Invoke-Command $a
PS>  $b
2

A híváskezelőről további információt a about_Operatorscímű témakörben talál.

Delay-bind scriptblocks használata paraméterekkel

A folyamatbemenetet elfogadó gépelt paraméter lehetővé teszi a delay-bind szkriptblokkok használatát a paraméteren. A delay-bind szkriptblokkokat rövidítésként használhatja a folyamatalapú parancsmag paramétereinek definiálásához a végrehajtás előtt.

A delay-bind szkriptblokkon belül hivatkozhat az objektumban lévő csőre a folyamatváltozó $_használatával.

# 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)" }

Összetettebb parancsmagok esetén a késleltetési kötés szkriptblokkjai lehetővé teszik, hogy az objektumban egy pipa újra felhasználja a többi paraméter feltöltését.

Megjegyzések a delay-bind szkriptblokkokról paraméterekként:

  • Explicit módon meg kell adnia a delay-bind szkriptblokkokkal használt paraméterneveket.

  • A paraméter nem írható be, és a paraméter típusa nem lehet [scriptblock] vagy [Object].

  • Hibaüzenet jelenik meg, ha folyamatbemenet megadása nélkül használ késleltetési kötésű szkriptblokkot.

    Rename-Item -NewName {$_.Name + ".old"}
    
    Rename-Item : Cannot evaluate parameter 'NewName' because its argument is
    specified as a scriptblock and there is no input. A scriptblock 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
    

Lásd még