about_Remote_Variables

Краткое описание

Объясняет использование локальных и удаленных переменных в удаленных командах.

Подробное описание

Переменные можно использовать в командах, выполняемых на удаленных компьютерах. Назначьте значение переменной, а затем используйте переменную вместо значения .

По умолчанию предполагается, что переменные в удаленных командах определяются в сеансе, в котором выполняется команда. Переменные, определенные в локальном сеансе, должны быть определены в команде как локальные переменные.

Использование удаленных переменных

В PowerShell предполагается, что переменные, используемые в удаленных командах, определяются в сеансе, в котором выполняется команда.

В этом примере $ps переменная определяется во временном сеансе, в котором выполняется Get-WinEvent команда.

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

Когда команда выполняется в постоянном сеансе PSSession, удаленная переменная должна быть определена в этом сеансе.

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

Использование локальных переменных

Локальные переменные можно использовать в удаленных командах, но переменная должна быть определена в локальном сеансе.

Начиная с PowerShell 3.0, можно использовать модификатор Using область для идентификации локальной переменной в удаленной команде.

Using Синтаксис выглядит следующим образом:

$Using:<VariableName>

В следующем примере $ps переменная создается в локальном сеансе, но используется в сеансе, в котором выполняется команда. Модификатор Using область определяет $ps как локальную переменную.

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

Модификатор Using область можно использовать в PSSession.

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

Ссылка на переменную, например $using:var , расширяется до значения переменной $var из контекста вызывающего объекта. Вы не получите доступ к объекту переменной вызывающего объекта. Модификатор Using область нельзя использовать для изменения локальной переменной в PSSession. Например, следующий код не работает:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

Дополнительные сведения о Usingсм. в разделе about_Scopes

Использование сплаттинга

Сплаттинг PowerShell передает коллекцию имен параметров и значений в команду. Дополнительные сведения см. в разделе about_Splatting.

В этом примере переменная splatting представляет собой хэш-таблицу, $Splat настроенную на локальном компьютере. Подключается Invoke-Command к сеансу удаленного компьютера. ScriptBlock использует модификатор Using область с символом At (@), чтобы представить переменную splatted.

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

Другие ситуации, когда требуется модификатор область Using

Для любого скрипта или команды, выполняемых вне сеанса, требуется Using модификатор область для внедрения значений переменных из вызывающего сеанса область, чтобы код вне сеанса смог получить к ним доступ. Модификатор Using область поддерживается в следующих контекстах:

  • Удаленно выполняемые команды, запущенные с Invoke-Command использованием параметров ComputerName, HostName, SSHConnection или Session (удаленный сеанс)
  • Фоновые задания, запущенные с Start-Job (внепроцессный сеанс)
  • Задания потока, запущенные с помощью Start-ThreadJob или ForEach-Object -Parallel (отдельный сеанс потока)

В зависимости от контекста внедренные значения переменных представляют собой независимые копии данных в область вызывающего объекта или ссылки на них. В удаленных и внепроцессных сеансах они всегда являются независимыми копиями. В сеансах потоков они передаются по ссылке.

Сериализация значений переменных

Удаленно выполняемые команды и фоновые задания выполняются вне процесса. Внепроцессные сеансы используют сериализацию на основе XML и десериализацию, чтобы сделать значения переменных доступными через границы процесса. Процесс сериализации преобразует объекты в PSObject , содержащий свойства исходных объектов, но не его методы.

Для ограниченного набора типов десериализация восстанавливает объекты обратно в исходный тип. Восстановленный объект является копией исходного экземпляра объекта. Он содержит свойства и методы типа. Для простых типов, таких как System.Version, копия является точной. Для сложных типов копия несовершенна. Например, восстановленные объекты сертификата не включают закрытый ключ.

Экземпляры всех остальных типов являются экземплярами PSObject . Свойство PSTypeNames содержит исходное имя типа с префиксом Deserialized, например Deserialized.System.Data.DataTable

Использование локальных переменных с параметром ArgumentList

Локальные переменные можно использовать в удаленной команде, определив параметры для удаленной команды и используя параметр ArgumentList командлета Invoke-Command , чтобы указать локальную переменную в качестве значения параметра.

  • param Используйте ключевое слово для определения параметров удаленной команды. Имена параметров — это заполнители, которые не должны соответствовать имени локальной переменной.

  • Используйте параметры, определенные param ключевое слово в команде .

  • Используйте параметр ArgumentList командлета Invoke-Command , чтобы указать локальную переменную в качестве значения параметра.

Например, следующие команды определяют $ps переменную в локальном сеансе, а затем используют ее в удаленной команде. Команда использует $log в качестве имени параметра, а в качестве значения локальную переменную $ps— .

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

См. также раздел