Zmienne zdalne — informacjeAbout Remote Variables

Krótki opisShort description

Wyjaśnia, jak używać zmiennych lokalnych i zdalnych w poleceniach zdalnych.Explains how to use local and remote variables in remote commands.

Długi opisLong description

W poleceniach uruchamianych na komputerach zdalnych można używać zmiennych.You can use variables in commands that you run on remote computers. Przypisz wartość do zmiennej, a następnie użyj zmiennej zamiast wartości.Assign a value to the variable and then use the variable in place of the value.

Domyślnie zmienne w poleceniach zdalnych zakłada się, że są zdefiniowane w sesji, która uruchamia polecenie.By default, the variables in remote commands are assumed to be defined in the session that runs the command. Zmienne, które są zdefiniowane w sesji lokalnej, muszą być identyfikowane jako zmienne lokalne w poleceniu.Variables that are defined in a local session, must be identified as local variables in the command.

Używanie zmiennych zdalnychUsing remote variables

W programie PowerShell założono, że zmienne używane w poleceniach zdalnych są zdefiniowane w sesji, w której uruchomiono polecenie.PowerShell assumes that the variables used in remote commands are defined in the session in which the command runs.

W tym przykładzie $ps zmienna jest definiowana w tymczasowej sesji, w której Get-WinEvent uruchomiono polecenie.In this example, the $ps variable is defined in the temporary session in which the Get-WinEvent command runs.

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

Gdy polecenie jest uruchamiane w trwałej sesji PSSession , zmienna zdalna musi być zdefiniowana w tej sesji.When the command runs in a persistent session, PSSession , the remote variable must be defined in that session.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Używanie zmiennych lokalnychUsing local variables

W poleceniach zdalnych można używać zmiennych lokalnych, ale zmienna musi być zdefiniowana w sesji lokalnej.You can use local variables in remote commands, but the variable must be defined in the local session.

Począwszy od programu PowerShell 3,0, można użyć Using modyfikatora Scope, aby zidentyfikować zmienną lokalną w poleceniu zdalnym.Beginning in PowerShell 3.0, you can use the Using scope modifier to identify a local variable in a remote command.

Składnia Using jest następująca:The syntax of Using is as follows:

$Using:<VariableName>

W poniższym przykładzie $ps zmienna jest tworzona w lokalnej sesji, ale jest używana w sesji, w której uruchomiono polecenie.In the following example, the $ps variable is created in the local session, but is used in the session in which the command runs. UsingModyfikator zakresu identyfikuje $ps jako zmienną lokalną.The Using scope modifier identifies $ps as a local variable.

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

UsingModyfikator Scope może być używany w PSSession.The Using scope modifier can be used in a PSSession.

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

Odwołanie do zmiennej, $using:var na przykład rozwijanie do wartości zmiennej $var z kontekstu obiektu wywołującego.A variable reference such as $using:var expands to the value of variable $var from the caller's context. Nie uzyskujesz dostępu do obiektu zmiennej wywołującej.You do not get access to the caller's variable object. UsingModyfikator zakresu nie może być używany do modyfikacji zmiennej lokalnej w PSSession.The Using scope modifier cannot be used to modify a local variable within the PSSession. Na przykład następujący kod nie działa:For example, the following code does not work:

$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_ScopesFor more information about Using, see about_Scopes

Korzystanie z korzystającUsing splatting

Program PowerShell korzystając przekazuje kolekcję nazw i wartości parametrów do polecenia.PowerShell splatting passes a collection of parameter names and values to a command. Aby uzyskać więcej informacji, zobacz about_Splatting.For more information, see about_Splatting.

W tym przykładzie zmienna korzystając $Splat jest tabelą skrótów, która jest skonfigurowana na komputerze lokalnym.In this example, the splatting variable, $Splat is a hash table that is set up on the local computer. Invoke-CommandNawiązuje połączenie z sesją komputera zdalnego.The Invoke-Command connects to a remote computer session. ScriptBlock używa Using modyfikatora Scope z symbolem at ( @ ), aby reprezentować zmienną splatted.The ScriptBlock uses the Using scope modifier with the At (@) symbol to represent the splatted variable.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

Inne sytuacje, w których wymagany jest modyfikator zakresu "Using"Other situations where the 'Using' scope modifier is needed

Dla dowolnego skryptu lub polecenia, które wykonuje sesję, potrzebny jest Using modyfikator zakresu, aby osadzić wartości zmiennych z zakresu sesji wywołującej, dzięki czemu kod sesji może uzyskiwać do nich dostęp.For any script or command that executes out of session, you need the Using scope modifier to embed variable values from the calling session scope, so that out of session code can access them. UsingModyfikator Scope jest obsługiwany w następujących kontekstach:The Using scope modifier is supported in the following contexts:

  • Polecenia wykonane zdalnie, rozpoczęte Invoke-Command przy użyciu parametrów ComputerName , hostname , SSHConnection lub Session (Sesja zdalna)Remotely executed commands, started with Invoke-Command using the ComputerName , HostName , SSHConnection or Session parameters (remote session)
  • Zadania w tle, uruchomione z Start-Job (pozaprocesowe sesji)Background jobs, started with Start-Job (out-of-process session)
  • Zadania wątków, rozpoczęte za pośrednictwem Start-ThreadJob lub ForEach-Object -Parallel (oddzielna sesja wątku)Thread jobs, started via Start-ThreadJob or ForEach-Object -Parallel (separate thread session)

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.Depending on the context, embedded variable values are either independent copies of the data in the caller's scope or references to it. W przypadku sesji zdalnych i pozaprocesowych są zawsze niezależnymi kopiami.In remote and out-of-process sessions, they are always independent copies. W sesjach wątków są one przesyłane przez odwołanie.In thread sessions, they are passed by reference.

Serializacja wartości zmiennychSerialization of variable values

Zdalnie wykonywane polecenia i zadania w tle są uruchamiane poza procesem.Remotely executed commands and background jobs run out-of-process. Sesje pozaprocesowe używają serializacji opartej na języku XML i deserializacji w celu udostępnienia wartości zmiennych w granicach procesu.Out-of-process sessions use XML-based serialization and deserialization to make the values of variables available across the process boundaries. Proces serializacji Konwertuje obiekty na PSObject , które zawierają oryginalne właściwości obiektów, ale nie ich metody.The serialization process converts objects to a PSObject that contains the original objects properties but not its methods.

W przypadku ograniczonego zestawu typów deserializacja oddzieli obiekty z powrotem do oryginalnego typu.For a limited set of types, deserialization rehydrates objects back to the original type. Obiekt z dehydratacji jest kopią oryginalnego wystąpienia obiektu.The rehydrated object is a copy of the original object instance. Ma właściwości typu i metody.It has the type properties and methods. W przypadku typów prostych, takich jak System. Version , kopia jest dokładna.For simple types, such as System.Version , the copy is exact. W przypadku typów złożonych kopia jest nieskomplikowana.For complex types, the copy is imperfect. Na przykład obiekty certyfikatu, które zostały podwodne, nie zawierają klucza prywatnego.For example, rehydrated certificate objects do not include the private key.

Wystąpienia wszystkich innych typów są wystąpieniami PSObject .Instances of all other types are PSObject instances. Właściwość PSTypeNames zawiera oryginalną nazwę typu poprzedzoną deserializowaną , na przykład Deserialized.System. Data. DataTableThe PSTypeNames property contains the original type name prefixed with Deserialized , for example, Deserialized.System.Data.DataTable

Używanie zmiennych lokalnych z parametrem listaargumentówUsing local variables with ArgumentList parameter

Możesz użyć zmiennych lokalnych w poleceniu zdalnym przez zdefiniowanie parametrów dla polecenia zdalnego i przy użyciu parametru listaargumentów Invoke-Command polecenia cmdlet, aby określić zmienną lokalną jako wartość parametru.You can use local variables in a remote command by defining parameters for the remote command and using the ArgumentList parameter of the Invoke-Command cmdlet to specify the local variable as the parameter value.

  • Użyj param słowa kluczowego, aby zdefiniować parametry dla polecenia zdalnego.Use the param keyword to define parameters for the remote command. Nazwy parametrów są symbolami zastępczymi, które nie muszą być zgodne z nazwą zmiennej lokalnej.The parameter names are placeholders that don't need to match the local variable's name.

  • Użyj parametrów zdefiniowanych przez param słowo kluczowe w poleceniu.Use the parameters defined by the param keyword in the command.

  • Użyj parametru listaargumentów Invoke-Command polecenia cmdlet, aby określić zmienną lokalną jako wartość parametru.Use the ArgumentList parameter of the Invoke-Command cmdlet to specify the local variable as the parameter value.

Na przykład następujące polecenia definiują $ps zmienną w sesji lokalnej, a następnie używają jej w poleceniu zdalnym.For example, the following commands define the $ps variable in the local session and then use it in a remote command. Polecenie używa jako $log nazwy parametru i zmiennej lokalnej, $ps , jako wartości.The command uses $log as the parameter name and the local variable, $ps, as its value.

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

Zobacz teżSee also

about_PSSessionsabout_PSSessions

about_Remoteabout_Remote

about_Scopesabout_Scopes

about_Splattingabout_Splatting

about_Variablesabout_Variables

Enter-PSSessionEnter-PSSession

Wywołaj polecenieInvoke-Command

New-PSSessionNew-PSSession

Start-ThreadJobStart-ThreadJob

ForEach-Object