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, SSH Verbinding maken ion of sessieparameters (externe sessie)
  • Achtergrondtaken, gestart met Start-Job (out-of-process sessie)
  • Threadtaken, gestart via Start-ThreadJob of ForEach-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, $psals waarde.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($log)
  Get-WinEvent -LogName $log
} -ArgumentList $ps

Zie ook