about_Remote_Variables
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 $ps
variabele gedefinieerd in de tijdelijke sessie waarin de Get-WinEvent
opdracht wordt uitgevoerd.
Invoke-Command -ComputerName S1 -ScriptBlock {
$ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}
Wanneer de opdracht wordt uitgevoerd in een permanente sessie, moet psSession 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 $ps
variabele 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
bereikaanpassing 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
breidt uit naar de waarde van de 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'}
Zie about_Scopes voor meer informatie over Using
Splatting gebruiken
PowerShell-splatting geeft een verzameling parameternamen en -waarden door aan een opdracht. Zie about_Splatting voor meer informatie.
In dit voorbeeld is de splatting-variabele $Splat
een hash-tabel die is ingesteld op de lokale computer. De Invoke-Command
verbinding maakt met een externe computersessie. ScriptBlock maakt gebruik van de Using
bereikaanpassing met het at-symbool (@
) 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 bereikaanpassing 'Using' nodig is
Voor een script of opdracht die buiten de sessie wordt uitgevoerd, hebt u de Using
bereikaanpassing nodig om variabele waarden uit het aanroepende sessiebereik in te sluiten, zodat deze toegang hebben tot de sessiecode. De Using
bereikaanpassing wordt ondersteund in de volgende contexten:
- Op afstand uitgevoerde opdrachten, gestart met
Invoke-Command
computernaam, hostnaam, SSHConnection of sessieparameters (externe sessie) - Achtergrondtaken, gestart met
Start-Job
(out-of-process sessie) - Threadtaken, gestart via
Start-ThreadJob
ofForEach-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 niet-processessies zijn ze altijd onafhankelijke kopieën. In threadsessies worden ze doorgegeven door verwijzing.
Serialisatie van variabele waarden
Op afstand uitgevoerde opdrachten en achtergrondtaken zijn verouderd. 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 dat de oorspronkelijke objecteigenschappen bevat, maar niet 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 eenvoudige typen, zoals System.Version, is de kopie exact. Voor complexe typen is de kopie onvolmaakt. Gerehydrateerde certificaatobjecten bevatten bijvoorbeeld niet de persoonlijke sleutel.
Exemplaren van alle andere typen zijn PSObject-exemplaren . 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 van de Invoke-Command
cmdlet te gebruiken om de lokale variabele op te geven als parameterwaarde.
Gebruik het
param
trefwoord om 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
param
trefwoord in de opdracht.Gebruik de parameter ArgumentList van de
Invoke-Command
cmdlet om 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