about_Script_Blocks

Rövid leírás

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

Hosszú leírás

A PowerShell programozási nyelvben a szkriptblokkok olyan utasítások vagy kifejezések gyűjteményei, amelyek egyetlen egységként használhatók. Az utasítások gyűjteménye kapcsos zárójelekben ({}függvényként definiálva) vagy szkriptfájlban menthető. A szkriptblokkok értékeket adnak vissza, és paramétereket és argumentumokat fogadnak el.

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 kulcsszóval return visszatérési értéket is megadhat. 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 elnevezett paramétereket rendelhet hozzá, ahogy az a következő szintaxisban is látható:

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

Feljegyzés

Egy szkriptblokkban a függvényekkel ellentétben nem adhat meg paramétereket a kapcsos zárójeleken kívül.

A függvényekhez hasonlóan a szkriptblokkok is tartalmazhatják a DynamicParam, Begin, Processés End kulcsszavakat. További információ: about_Functions és about_Functions_Advanced.

Szkriptblokkok használata

A szkriptblokk egy Microsoft .NET-keretrendszer típusú System.Management.Automation.ScriptBlockpéldány. A parancsok szkriptblokk paraméterértékekkel is rendelkezhetnek. A parancsmag például rendelkezik egy ScriptBlock paraméterrel, Invoke-Command amely egy szkriptblokk értékét veszi 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éterblokkokat tartalmazó 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 Argumentumlista működé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ók használhatók. Az alábbi példa egy szkriptblokkot tárol egy változóban, és átadja a változónak 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ő megkönnyíti a paraméterek használatát a szkriptblokkokkal.

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

A szkriptblokkok kimenetét 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_Operators talál.

Késleltetett kötésű szkriptblokkok 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 késleltetett kötésű 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 parancsmagokban a késleltetett kötésű szkriptblokkok lehetővé teszik az objektumban lévő egy cső újrahasználatát más paraméterek feltöltéséhez.

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

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

  • A paraméter nem lehet beíratlan, és a paraméter típusa nem lehet [scriptblock] vagy [object]nem.

  • 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 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
    

Lásd még