Udostępnij za pośrednictwem


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 zakłada się, że 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ą definiowane 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 Using funkcji jest następująca:

$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 rozszerza wartość zmiennej $var z kontekstu obiektu wywołującego. Nie uzyskujesz dostępu do obiektu zmiennej obiektu wywołującego. Modyfikator Using zakresu nie może służyć do modyfikowania zmiennej lokalnej w ramach programu 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 Usingprogramu , zobacz about_Scopes

Korzystanie z platania

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ótów skonfigurowaną na komputerze lokalnym. Program Invoke-Command nawiązuje połączenie 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 jest wykonywane poza sesją, należy 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ątków, uruchamiane za pośrednictwem lub Start-ThreadJobForEach-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ą zawsze niezależne kopie. 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 kodzie XML w celu udostępnienia wartości zmiennych w granicach procesu. Proces serializacji konwertuje obiekty na obiekt PSObject , który zawiera 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 z ponownym wypełnianiem 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 z ponownym wypełnianiem nie zawierają klucza prywatnego.

Wystąpienia wszystkich innych typów to wystąpienia obiektu PSObject . Właściwość PSTypeNames zawiera oryginalną nazwę typu poprzedzoną deserializacji, 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 polecenia zdalnego i używając parametru Invoke-CommandArgumentList 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 ArgumentList polecenia cmdlet, Invoke-Command 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 zdalnym poleceniu. Polecenie używa $log jako nazwy parametru i zmiennej lokalnej , $psjako wartości.

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

Zobacz też