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.
В этом примере переменная $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, SSHConnection или 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
См. также
PowerShell