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 ett värde till variabeln och använd sedan variabeln i stället för värdet.

Som standard antas variablerna i fjärrkommandon definieras i den session där kommandot körs. 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 $ps definieras variabeln 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 för att identifiera Using en lokal variabel i ett fjärrkommando.

Syntaxen för Using är följande:

$Using:<VariableName>

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

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

UsingOmfångsmodifieraren 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 variabelvärdet $var från anroparens kontext. Du får inte åtkomst till anroparens variabelobjekt. UsingOmfångsmodifieraren 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 Using finns 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 den ihopsidade $Splat variabeln en hash-tabell som har ställts in 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 splatterade variabeln.

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

Andra situationer där omfångsmodifieraren "Använda" krävs

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

  • Fjärrstyrda kommandon som startats med hjälp Invoke-Command av parametrarna ComputerName, HostName, SSHConnection eller Session (fjärrsession)
  • Bakgrundsjobb som Start-Job startats med (utanför processsessionen)
  • Trådjobb som startas 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ärrsessioner och sessioner utanför processen är de alltid oberoende kopior. I trådsessioner skickas de som referens.

Serialisering av variabelvärden

Fjärrstyrda 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 ett PSObject som innehåller de ursprungliga objektegenskaperna men inte dess metoder.

För en begränsad uppsättning typer återuppförs deserialiseringsobjekt 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 inte perfekt. Till exempel innehåller rehydrerade certifikatobjekt inte den privata nyckeln.

Instanser av alla andra typer är PSObject-instanser. Egenskapen PSTypeNames innehåller det ursprungliga typnamnet med prefixet 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 för att ange den lokala variabeln Invoke-Command som parametervärde.

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

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

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

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

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

Se även

about_PSSessions

about_Remote

about_Scopes

about_Splatting

about_Variables

Enter-PSSession

Invoke-Command

New-PSSession

Start-ThreadJob

ForEach-Object