Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 Using:
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ą prefiksem Deserialized, na przykład Deserialized.System.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 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 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