Поделиться через


о_Удалённых_Переменных

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

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

Длинное описание

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

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

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

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: можно использовать в сеансе PowerShell .

$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 (@) для представления развернутой переменной.

$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.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

См. также