Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Korte beschrijving
Hierin wordt uitgelegd hoe u lokale en externe variabelen gebruikt in externe opdrachten.
Lange beschrijving
U kunt variabelen gebruiken in opdrachten die u uitvoert op externe computers. Wijs een waarde toe aan de variabele en gebruik vervolgens de variabele in plaats van de waarde.
Standaard wordt ervan uitgegaan dat de variabelen in externe opdrachten worden gedefinieerd in de sessie waarop de opdracht wordt uitgevoerd. Variabelen die zijn gedefinieerd in een lokale sessie, moeten worden geïdentificeerd als lokale variabelen in de opdracht.
Externe variabelen gebruiken
PowerShell gaat ervan uit dat de variabelen die worden gebruikt in externe opdrachten worden gedefinieerd in de sessie waarin de opdracht wordt uitgevoerd.
In dit voorbeeld wordt de variabele $ps gedefinieerd in de tijdelijke sessie waarin de opdracht Get-WinEvent wordt uitgevoerd.
Invoke-Command -ComputerName S1 -ScriptBlock {
$ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}
Wanneer de opdracht wordt uitgevoerd in een permanente sessie, PSSession, moet de externe variabele worden gedefinieerd in die sessie.
$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}
Lokale variabelen gebruiken
U kunt lokale variabelen in externe opdrachten gebruiken, maar de variabele moet worden gedefinieerd in de lokale sessie.
Vanaf PowerShell 3.0 kunt u de Using: bereikaanpassing gebruiken om een lokale variabele in een externe opdracht te identificeren.
De syntaxis van Using: is als volgt:
$Using:<VariableName>
In het volgende voorbeeld wordt de variabele $ps gemaakt in de lokale sessie, maar wordt gebruikt in de sessie waarin de opdracht wordt uitgevoerd. De Using: bereikaanpassing identificeert $ps als een lokale variabele.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
Get-WinEvent -LogName $Using:ps
}
De Using: scope-modificator kan worden gebruikt in een PSSession.
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}
Een variabelereferentie zoals $Using:var wordt uitgebreid naar de waarde van variabele $var vanuit de context van de aanroeper. U krijgt geen toegang tot het variabele object van de beller. De Using: bereikwijziging kan niet worden gebruikt om een lokale variabele binnen de PSSession-te wijzigen. De volgende code werkt bijvoorbeeld niet:
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}
Voor meer informatie over Using:, zie about_Scopes
Splatting gebruiken
PowerShell-splatting geeft een verzameling parameternamen en -waarden door aan een opdracht. Zie about_Splattingvoor meer informatie.
In dit voorbeeld is de splatting-variabele $Splat een hash-tabel die is ingesteld op de lokale computer. De Invoke-Command maakt verbinding met een externe computersessie. De ScriptBlock gebruikt de Using: bereikaanpassing met het symbool At (@) om de geplatte variabele weer te geven.
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
Andere situaties waarin de Using: bereikaanpassing nodig is
Voor elk script of commando dat buiten de sessie wordt uitgevoerd, hebt u de Using: bereikaanpassing nodig om variabele waarden vanuit het aanroepende sessiebereik in te sluiten, zodat code buiten de sessie hier toegang toe heeft. De Using: bereikaanpassing wordt ondersteund in de volgende contexten:
- Op afstand uitgevoerde opdrachten, gestart met
Invoke-Commandmet behulp van de ComputerName, HostName, SSHConnection of Session parameters (externe sessie) - Achtergrondtaken die gestart zijn met
Start-Job(sessie buiten het proces) - Draad-taken, gestart via
Start-ThreadJobofForEach-Object -Parallel(afzonderlijke threadsessie)
Afhankelijk van de context zijn ingesloten variabelewaarden onafhankelijke kopieën van de gegevens in het bereik van de beller of verwijzingen ernaar. In externe en buiten-proces sessies zijn ze altijd onafhankelijke kopieën. In thread-sessies worden ze doorgegeven via verwijzing.
Serialisatie van variabele waarden
Op afstand uitgevoerde opdrachten en achtergrondtaken worden buiten het hoofproces uitgevoerd. Out-of-process sessies maken gebruik van op XML gebaseerde serialisatie en deserialisatie om de waarden van variabelen beschikbaar te maken binnen de procesgrenzen. Het serialisatieproces converteert objecten naar een PSObject- die de oorspronkelijke objecteigenschappen bevat, maar niet naar de bijbehorende methoden.
Voor een beperkte set typen rehydrateeert deserialisatie objecten terug naar het oorspronkelijke type. Het gerehydrateerde object is een kopie van het oorspronkelijke objectexemplaar. Het heeft de typeeigenschappen en -methoden. Voor simpele types, zoals System.Version, is de kopie precies. Voor complexe typen is de kopie onvolmaakt. Gerehydrateerde certificaatobjecten bevatten bijvoorbeeld niet de persoonlijke sleutel.
Exemplaren van alle andere typen zijn PSObject. De eigenschap pstypenames bevat de oorspronkelijke typenaam voorafgegaan door gedeserialiseerde, bijvoorbeeld Deserialized.System.Data.DataTable
Lokale variabelen gebruiken met de parameter ArgumentList
U kunt lokale variabelen in een externe opdracht gebruiken door parameters voor de externe opdracht te definiëren en de parameter ArgumentList parameter van de Invoke-Command cmdlet te gebruiken om de lokale variabele op te geven als parameterwaarde.
Gebruik het trefwoord
paramom parameters voor de externe opdracht te definiëren. De parameternamen zijn tijdelijke aanduidingen die niet overeenkomen met de naam van de lokale variabele.Gebruik de parameters die zijn gedefinieerd door het
paramtrefwoord in de opdracht.Gebruik de parameter ArgumentList van de cmdlet
Invoke-Commandom de lokale variabele op te geven als parameterwaarde.
Met de volgende opdrachten definieert u bijvoorbeeld de $ps variabele in de lokale sessie en gebruikt u deze vervolgens in een externe opdracht. De opdracht gebruikt $Log als de parameternaam en de lokale variabele, $ps, als waarde.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($Log)
Get-WinEvent -LogName $Log
} -ArgumentList $ps