about_Remote_Variables
Krótki opis
Wyjaśnia, jak używać zmiennych lokalnych i zdalnych w poleceniach zdalnych.
Długi opis
Zmienne można używać w poleceniach uruchamianych na komputerach zdalnych. Przypisz wartość do zmiennej, a następnie użyj zmiennej zamiast wartości.
Domyślnie zmienne w poleceniach zdalnych są definiowane w sesji, która uruchamia polecenie. Zmienne zdefiniowane w sesji lokalnej muszą być identyfikowane jako zmienne lokalne w poleceniu.
Używanie zmiennych zdalnych
Program PowerShell zakłada, że zmienne używane w poleceniach zdalnych są zdefiniowane w sesji, w której jest uruchamiane polecenie.
W tym przykładzie zmienna jest definiowana $ps
w sesji tymczasowej, w której Get-WinEvent
jest uruchamiane polecenie.
Invoke-Command -ComputerName S1 -ScriptBlock {
$ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}
Gdy polecenie jest uruchamiane w sesji trwałej, PSSession, zmienna zdalna musi być zdefiniowana w tej sesji.
$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}
Używanie zmiennych lokalnych
Zmienne lokalne można używać w poleceniach zdalnych, ale zmienna musi być zdefiniowana w sesji lokalnej.
Począwszy od programu PowerShell 3.0, można użyć Using
modyfikatora zakresu, aby zidentyfikować zmienną lokalną w poleceniu zdalnym.
Składnia funkcji jest następująca Using
:
$Using:<VariableName>
W poniższym przykładzie zmienna $ps
jest tworzona w sesji lokalnej, ale jest używana w sesji, w której jest uruchamiane polecenie. Modyfikator Using
zakresu identyfikuje $ps
się jako zmienną lokalną.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
Get-WinEvent -LogName $Using:ps
}
Modyfikator Using
zakresu może być używany w programie PSSession.
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}
Odwołanie do zmiennej, takie jak $using:var
rozszerzenie do wartości zmiennej $var
z kontekstu obiektu wywołującego. Nie uzyskujesz dostępu do obiektu zmiennej obiektu obiektu wywołującego.
Modyfikator Using
zakresu nie może służyć do modyfikowania zmiennej lokalnej w programie PSSession. Na przykład następujący kod nie działa:
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}
Aby uzyskać więcej informacji na temat Using
programu , zobacz about_Scopes
Korzystanie z rozplatania
Przeplatanie programu PowerShell przekazuje kolekcję nazw parametrów i wartości do polecenia. Aby uzyskać więcej informacji, zobacz about_Splatting.
W tym przykładzie zmienna $Splat
splatting jest tabelą skrótu skonfigurowaną na komputerze lokalnym. Program Invoke-Command
łączy się z sesją komputera zdalnego. Funkcja ScriptBlock używa Using
modyfikatora zakresu z symbolem At (@
), aby reprezentować zmienną splatted.
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
Inne sytuacje, w których jest wymagany modyfikator zakresu "Korzystanie"
W przypadku dowolnego skryptu lub polecenia, które wykonuje poza sesją, musisz Using
modyfikator zakresu osadzić wartości zmiennych z zakresu sesji wywołującej, aby kod poza sesją mógł uzyskać do nich dostęp. Modyfikator Using
zakresu jest obsługiwany w następujących kontekstach:
- Polecenia wykonywane zdalnie, rozpoczęte
Invoke-Command
przy użyciu parametrów ComputerName, HostName, SSHConnection lub Session (sesja zdalna) - Zadania w tle, rozpoczęte
Start-Job
od (sesja poza procesem) - Zadania wątku, uruchomione za pośrednictwem lub
Start-ThreadJob
ForEach-Object -Parallel
(oddzielna sesja wątku)
W zależności od kontekstu osadzone wartości zmiennych są niezależnymi kopiami danych w zakresie obiektu wywołującego lub odwołaniami do niego. W sesjach zdalnych i poza procesem są one zawsze niezależnymi kopiami. W sesjach wątków są przekazywane przez odwołanie.
Serializacja wartości zmiennych
Zdalnie wykonywane polecenia i zadania w tle kończą się poza procesem. Sesje poza procesem używają serializacji i deserializacji opartej na języku XML w celu udostępnienia wartości zmiennych w granicach procesu. Proces serializacji konwertuje obiekty na obiekt PSObject zawierający oryginalne właściwości obiektów, ale nie jego metody.
W przypadku ograniczonego zestawu typów deserializacja przywraca obiekty z powrotem do oryginalnego typu. Obiekt ponownie wypełniania jest kopią oryginalnego wystąpienia obiektu. Ma właściwości i metody typu. W przypadku prostych typów, takich jak System.Version, kopia jest dokładna. W przypadku typów złożonych kopia jest niedoskonała. Na przykład obiekty certyfikatów ponownie wypełniania nie zawierają klucza prywatnego.
Wystąpienia wszystkich innych typów to wystąpienia obiektu PSObject . Właściwość PSTypeNames zawiera oryginalną nazwę typu poprzedzoną deserializowaną, na przykład Deserialized.System.Data.Data.DataTable
Używanie zmiennych lokalnych z parametrem ArgumentList
Zmienne lokalne można użyć w zdalnym poleceniu, definiując parametry dla zdalnego polecenia i używając parametru Invoke-Command
ArgumentList polecenia cmdlet, aby określić zmienną lokalną jako wartość parametru.
Użyj słowa kluczowego
param
, aby zdefiniować parametry polecenia zdalnego. Nazwy parametrów są symbolami zastępczymi, które nie muszą być zgodne z nazwą zmiennej lokalnej.Użyj parametrów zdefiniowanych przez
param
słowo kluczowe w poleceniu .Użyj parametru
Invoke-Command
ArgumentList polecenia cmdlet, aby określić zmienną lokalną jako wartość parametru.
Na przykład następujące polecenia definiują zmienną $ps
w sesji lokalnej, a następnie używają jej w poleceniu zdalnym. Polecenie używa $log
jako nazwy parametru i zmiennej lokalnej , $ps
jako wartości.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps