Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 Using: omfångsmodifierare 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-Commandparametrarna ComputerName, HostName, SSHConnection eller Session (fjärrsession)
- Bakgrundsjobb som startats med Start-Job(out-of-process session)
- Trådjobb, startade via Start-ThreadJobellerForEach-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 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 Invoke-Command för att ange den lokala variabeln som parametervärde.
- Använd nyckelordet - paramfö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 - parami kommandot .
- Använd parametern ArgumentList för cmdleten - Invoke-Commandfö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