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 zijn gedefinieerd in de sessie die de opdracht uitvoert. 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 zijn 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, 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 gebruiken in externe opdrachten, 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 deze gebruikt in de sessie waarin de opdracht wordt uitgevoerd. De Using wijziging van het bereik 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 wordt uitgebreid naar de waarde van de variabele $var vanuit de context van de aanroeper. U krijgt geen toegang tot het variabeleobject van de aanroeper. De Using bereikaanpassing 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 splattingsvariabele $Splat een hash-tabel die is ingesteld op de lokale computer. De Invoke-Command maakt verbinding met een externe computersessie. Het 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 bereikaanpassing 'Using' nodig is

Voor elk script of elke 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 buiten sessiecode toegankelijk zijn. De Using bereikaanpassing wordt ondersteund in de volgende contexten:

  • Extern uitgevoerde opdrachten, gestart met Invoke-Command de parameters ComputerName, HostName, SSHConnection of Sessie (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 aanroeper of verwijzingen ernaar. In externe en out-of-process sessies zijn het altijd onafhankelijke kopieën. In threadsessies worden ze doorgegeven door verwijzing.

Serialisatie van variabelewaarden

Extern uitgevoerde opdrachten en achtergrondtaken zijn verlopen. Out-of-process sessies maken gebruik van serialisatie en deserialisatie op basis van XML om de waarden van variabelen beschikbaar te maken over de procesgrenzen heen. Tijdens het serialisatieproces worden objecten geconverteerd naar een PSObject dat de oorspronkelijke eigenschappen van objecten bevat, maar niet de bijbehorende methoden.

Voor een beperkte set typen rehydrateerd deserialisatie objecten terug naar het oorspronkelijke type. Het gerehydrateerde object is een kopie van het oorspronkelijke objectexemplaar. Het heeft de eigenschappen en methoden van het type. 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 Deserialized, bijvoorbeeld Deserialized.System.Data.DataTable

Lokale variabelen gebruiken met 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 de parameterwaarde.

De volgende opdrachten definiëren bijvoorbeeld de $ps variabele in de lokale sessie en gebruiken deze vervolgens in een externe opdracht. De opdracht gebruikt $log als de parameternaam en de lokale variabele, $ps, als de waarde.

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

Zie ook