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'}

Дополнительные сведения см. в Usingabout_Scopes

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

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

В этом примере переменная $Splat splatting представляет собой хэш-таблицу, настроенную на локальном компьютере. Подключение 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, SSH Подключение ion или Session (удаленный сеанс)
  • Фоновые задания, запущенные с Start-Job (сеанс вне процесса)
  • Задания потоков, запущенные через Start-ThreadJob или ForEach-Object -Parallel (отдельный сеанс потока)

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

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

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

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

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

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

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

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

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

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

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

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

См. также