about_Script_Blocks
Korte beschrijving
Definieert wat een scriptblok is en legt uit hoe u scriptblokken gebruikt in de PowerShell-programmeertaal.
Lange beschrijving
In de PowerShell-programmeertaal is een scriptblok een verzameling instructies of expressies die als één eenheid kunnen worden gebruikt. Een scriptblok kan argumenten accepteren en waarden retourneren.
Syntactisch is een scriptblok een instructielijst tussen accolades, zoals wordt weergegeven in de volgende syntaxis:
{<statement list>}
Een scriptblok retourneert de uitvoer van alle opdrachten in het scriptblok, hetzij als één object of als een matrix.
U kunt ook een retourwaarde opgeven met behulp van het return
trefwoord. Het return
trefwoord heeft geen invloed op of onderdrukt geen andere uitvoer die wordt geretourneerd door het scriptblok. return
Het trefwoord sluit echter het scriptblok op die regel af. Zie about_Return voor meer informatie.
Net als bij functies kan een scriptblok parameters bevatten. Gebruik het trefwoord Param om benoemde parameters toe te wijzen, zoals wordt weergegeven in de volgende syntaxis:
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
Notitie
In een scriptblok kunt u, in tegenstelling tot een functie, geen parameters buiten de accolades opgeven.
Net als bij functies kunnen scriptblokken de DynamicParam
trefwoorden , Begin
, Process
en End
bevatten. Zie about_Functions en about_Functions_Advanced voor meer informatie.
Scriptblokken gebruiken
Een scriptblok is een exemplaar van een Microsoft-.NET Framework-type System.Management.Automation.ScriptBlock
. Opdrachten kunnen parameterwaarden voor scriptblok bevatten. De cmdlet heeft bijvoorbeeld Invoke-Command
een ScriptBlock
parameter die een scriptblokwaarde gebruikt, zoals in dit voorbeeld wordt weergegeven:
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 ook scriptblokken uitvoeren die parameterblokken bevatten.
Parameters worden toegewezen per positie met behulp van de parameter ArgumentList .
Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second
Het scriptblok in het vorige voorbeeld gebruikt het param
trefwoord om een parameter $p1
en $p2
te maken. De tekenreeks 'First' is gebonden aan de eerste parameter ($p1
) en 'Second' is gebonden aan ($p2
).
Zie about_Splatting voor meer informatie over het gedrag van ArgumentList.
U kunt variabelen gebruiken om scriptblokken op te slaan en uit te voeren. In het onderstaande voorbeeld wordt een scriptblok opgeslagen in een variabele en doorgegeven aan Invoke-Command
.
$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status Name DisplayName
------ ---- -----------
Running BITS Background Intelligent Transfer Ser...
De aanroepoperator is een andere manier om scriptblokken uit te voeren die zijn opgeslagen in een variabele.
Net als Invoke-Command
, voert de aanroepoperator het scriptblok uit in een onderliggend bereik. Met de aanroepoperator kunt u eenvoudiger parameters gebruiken met uw scriptblokken.
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
U kunt de uitvoer van uw scriptblokken opslaan in een variabele met behulp van toewijzing.
PS> $a = { 1 + 1}
PS> $b = &$a
PS> $b
2
PS> $a = { 1 + 1}
PS> $b = Invoke-Command $a
PS> $b
2
Zie about_Operators voor meer informatie over de oproepoperator.
Scriptblokken voor vertragingsbinding gebruiken met parameters
Een getypte parameter die pijplijninvoer (by Value
) of (by PropertyName
) accepteert, maakt het gebruik van scriptblokken met vertragingsbinding op de parameter mogelijk.
Binnen het scriptblok voor vertragingsbinding kunt u verwijzen naar het object dat is doorgesluisd met behulp van de pijplijnvariabele $_
.
# Renames config.log to old_config.log
dir config.log | Rename-Item -NewName {"old_" + $_.Name}
In complexere cmdlets kunnen scriptblokken met vertragingsbindingen het hergebruiken van één object dat is doorgesluisd, worden gebruikt om andere parameters te vullen.
Opmerkingen over scriptblokken voor vertragingsbinding als parameters:
U moet expliciet parameternamen opgeven die u gebruikt met scriptblokken voor vertragingsbinding .
De parameter mag niet worden getypeerd en het type van de parameter mag niet of
[object]
zijn[scriptblock]
.U ontvangt een fout als u een scriptblok voor vertragingsbinding gebruikt zonder pijplijninvoer op te geven.
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