about_Remote_Variables

Kort beskrivning

Förklarar hur du använder lokala variabler och fjärrvariabler i fjärrkommandon.

Lång beskrivning

Du kan använda variabler i kommandon som du kör på fjärrdatorer. Tilldela variabeln ett värde och använd sedan variabeln i stället för värdet.

Som standard antas variablerna i fjärrkommandon definieras i den session som kör kommandot. Variabler som definieras i en lokal session måste identifieras som lokala variabler i kommandot.

Använda fjärrvariabler

PowerShell förutsätter att variablerna som används i fjärrkommandon definieras i den session där kommandot körs.

I det här exemplet definieras variabeln $ps i den tillfälliga session där Get-WinEvent kommandot körs.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

När kommandot körs i en beständig session, PSSession, måste fjärrvariabeln definieras i den sessionen.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Använda lokala variabler

Du kan använda lokala variabler i fjärrkommandon, men variabeln måste definieras i den lokala sessionen.

Från och med PowerShell 3.0 kan du använda omfångsmodifieraren Using för att identifiera en lokal variabel i ett fjärrkommando.

Syntaxen för Using är följande:

$Using:<VariableName>

I följande exempel skapas variabeln $ps i den lokala sessionen, men används i sessionen där kommandot körs. Omfångsmodifieraren Using$ps identifierar som en lokal variabel.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Omfångsmodifieraren Using kan användas i en PSSession.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

En variabelreferens som $using:var expanderar till värdet för variabeln $var från anroparens kontext. Du får inte åtkomst till anroparens variabelobjekt. Omfångsmodifieraren Using kan inte användas för att ändra en lokal variabel i PSSession. Följande kod fungerar till exempel inte:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

Mer information om Usingfinns i about_Scopes

Använda splatting

PowerShell-splatting skickar en samling parameternamn och värden till ett kommando. Mer information finns i about_Splatting.

I det här exemplet är splatting-variabeln $Splat en hash-tabell som har konfigurerats på den lokala datorn. Ansluter Invoke-Command till en fjärrdatorsession. ScriptBlock använder Using omfångsmodifieraren med symbolen At (@) för att representera den splattade variabeln.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

Andra situationer där omfångsmodifieraren "Using" behövs

För alla skript eller kommandon som körs utanför sessionen behöver du omfångsmodifieraren Using för att bädda in variabelvärden från det anropande sessionsomfånget, så att kod utanför sessionen kan komma åt dem. Omfångsmodifieraren Using stöds i följande kontexter:

  • Fjärrstyrda kommandon, som började med Invoke-Command parametrarna ComputerName, HostName, SSH Anslut ion eller Session (fjärrsession)
  • Bakgrundsjobb som startats med Start-Job (out-of-process session)
  • Trådjobb, startade via Start-ThreadJob eller ForEach-Object -Parallel (separat trådsession)

Beroende på kontexten är inbäddade variabelvärden antingen oberoende kopior av data i anroparens omfång eller referenser till dem. I fjärranslutna och processfria sessioner är de alltid oberoende kopior. I trådsessioner skickas de med referens.

Serialisering av variabelvärden

Fjärrkörda kommandon och bakgrundsjobb tar slut. Out-of-process-sessioner använder XML-baserad serialisering och deserialisering för att göra värdena för variabler tillgängliga över processgränserna. Serialiseringsprocessen konverterar objekt till en PSObject som innehåller de ursprungliga objektegenskaperna men inte dess metoder.

För en begränsad uppsättning typer extraherar deserialisering objekten tillbaka till den ursprungliga typen. Det rehydrerade objektet är en kopia av den ursprungliga objektinstansen. Den har typegenskaper och metoder. För enkla typer, till exempel System.Version, är kopian exakt. För komplexa typer är kopian ofullständig. Till exempel innehåller inte de uttorkade certifikatobjekten den privata nyckeln.

Instanser av alla andra typer är PSObject-instanser . Egenskapen PSTypeNames innehåller det ursprungliga typnamnet prefixet med Deserialized, till exempel Deserialized.System.Data.DataTable

Använda lokala variabler med parametern ArgumentList

Du kan använda lokala variabler i ett fjärrkommando genom att definiera parametrar för fjärrkommandot och använda parametern ArgumentList för cmdleten Invoke-Command för att ange den lokala variabeln som parametervärde.

  • Använd nyckelordet param för att definiera parametrar för fjärrkommandot. Parameternamnen är platshållare som inte behöver matcha den lokala variabelns namn.

  • Använd parametrarna som definieras av nyckelordet param i kommandot .

  • Använd parametern ArgumentList för cmdleten Invoke-Command för att ange den lokala variabeln som parametervärde.

Följande kommandon definierar till exempel variabeln $ps i den lokala sessionen och använder den sedan i ett fjärrkommando. Kommandot använder $log som parameternamn och den lokala variabeln , $pssom dess värde.

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

Se även