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 gebruiken in externe opdrachten, maar de variabele moet worden gedefinieerd in de lokale sessie.
Vanaf PowerShell 3.0 kunt u de Using bereikwijziging gebruiken om een lokale variabele in een externe opdracht te identificeren.
De syntaxis van Using deze is als volgt:
$Using:<VariableName>
In het volgende voorbeeld wordt de $ps variabele gemaakt in de lokale sessie, maar gebruikt in de sessie waarin de opdracht wordt uitgevoerd. De Using bereikwijziging identificeert $ps als een lokale variabele.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
Get-WinEvent -LogName $Using:ps
}
De Using bereikwijziging kan worden gebruikt in een PSSession.
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}
Een verwijzing naar variabelen, zoals $using:var uitvouwen 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 in 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 wordt gemaakt met een externe computersessie. ScriptBlock gebruikt de Using bereikwijziging 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 bereikwijziging 'Using' nodig is
Voor een script of opdracht die buiten de sessie wordt uitgevoerd, hebt u de wijziging van het Using bereik nodig om variabele waarden in te sluiten vanuit het aanroepende sessiebereik, zodat uit sessiecode toegang heeft tot deze waarden. De Using bereikwijziging wordt ondersteund in de volgende contexten:
- Extern uitgevoerde opdrachten, gestart met
Invoke-Commandcomputernaam, hostnaam, SSHConnection of sessieparameters (externe sessie) - Achtergrondtaken, gestart met
Start-Job(out-of-process session) - Threadtaken, 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 aanroeper of verwijzingen ernaar. In externe en out-of-process sessies zijn ze altijd onafhankelijke kopieën. In threadsessies worden ze doorgegeven door verwijzing.
Serialisatie van variabelewaarden
Op afstand uitgevoerde opdrachten en achtergrondtaken zijn verouderd. Out-of-process-sessies maken gebruik van serialisatie en deserialisatie op basis van XML om de waarden van variabelen beschikbaar te maken voor de procesgrenzen. Het serialisatieproces converteert objecten naar een PSObject dat de oorspronkelijke objecteigenschappen bevat, maar niet de methoden.
Voor een beperkte set typen rehydrateert 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 Gedeserialized, 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
paramtrefwoord 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
paramtrefwoord in de opdracht.Gebruik de parameter ArgumentList van de
Invoke-Commandcmdlet 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 wordt gebruikt $log als de parameternaam en de lokale variabele, $psals waarde.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps