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 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 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
ellerForEach-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 , $ps
som dess värde.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps