Udostępnij za pośrednictwem


opis_Zmiennych_Zdalnych

Krótki opis

Wyjaśnia, jak używać zmiennych lokalnych i zdalnych w poleceniach zdalnych.

Długi opis

Można używać zmiennych 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 $ps jest definiowana w sesji tymczasowej, w której jest uruchamiane polecenie Get-WinEvent.

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ć modyfikatora zakresu Using:, aby zidentyfikować zmienną lokalną w poleceniu zdalnym.

Składnia Using: 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 zakresu Using: identyfikuje $ps jako zmienną lokalną.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Modyfikator zakresu Using: może być używany w 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 zmiennych wywołującego. Modyfikator zakresu Using: nie może służyć do modyfikowania zmiennej lokalnej w 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:, zobacz about_Scopes

Korzystanie z rozszerzania argumentów

Splatting w PowerShell przekazuje kolekcję nazw parametrów i ich wartości do polecenia. Aby uzyskać więcej informacji, zobacz about_Splatting.

W tym przykładzie zmienna splatting $Splat jest tabelą skrótów skonfigurowaną na komputerze lokalnym. Invoke-Command nawiązuje połączenie z sesją komputera zdalnego. ScriptBlock używa modyfikatora zakresu Using: z symbolem At (@) do oznaczenia rozsypanej zmiennej.

$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 wykonywanego poza sesją potrzebny jest modyfikator zakresu Using: do osadzania wartości zmiennych z zakresu sesji wywołującej, aby kod poza sesją mógł uzyskać do nich dostęp. Modyfikator zakresu Using: jest obsługiwany w następujących kontekstach:

  • Polecenia wykonywane zdalnie, rozpoczęte przez Invoke-Command przy użyciu parametrów ComputerName, Nazwa hosta, SSHConnection lub parametrów sesji (sesja zdalna)
  • Zadania w tle, rozpoczynające się z użyciem Start-Job (sesja spoza procesu)
  • Zadania wątków, uruchamiane za pośrednictwem Start-ThreadJob lub 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 tych spoza procesu, zawsze są to niezależne kopie. W sesjach wątków przekazuje się przez referencję.

Serializacja wartości zmiennych

Zdalnie wykonywane polecenia i zadania w tle działają poza głównym 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 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 przywrócony jest kopią oryginalnego wystąpienia obiektu. Ma właściwości typu i metody. 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 odświeżane obiekty certyfikatów nie zawierają klucza prywatnego.

Instancje wszystkich innych typów to instancje 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 polecenia zdalnego i używając parametru ArgumentList polecenia cmdlet Invoke-Command, 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 słowo kluczowe param 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 poleceniu zdalnym. Polecenie używa $Log jako nazwy parametru i zmiennej lokalnej $psjako jego wartości.

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

Zobacz także