Отправка параметров на удаленные компьютеры в Windows PowerShell
Вы уже узнали, что Invoke-Command не может включать переменные в свой блок скрипта или файл скрипта, если удаленный компьютер не сможет понять эти переменные. Таким образом, может показаться, что будет сложнее найти способ передачи данных с инициирующего компьютера на удаленный компьютер. Тем не менее , Invoke-Command фактически предоставляет конкретный механизм для выполнения этой задачи.
Цель следующей команды — отобразить список из 10 последних записей журнала событий безопасности на каждом целевом компьютере. Однако команда не будет работать так, как она написана:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-EventLog –LogName $Log –Newest $Quantity
}
Проблема заключается в том, что переменные $Log
и $Quantity
имеют значения только на локальном компьютере, и эти значения не вставляются в блок сценария до отправки этих значений на удаленные компьютеры. Поэтому удаленные компьютеры не знают, что они означают.
Правильный синтаксис для этой команды выглядит следующим образом:
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity
С помощью этого синтаксиса локальные переменные передаются в параметр ArgumentList команды Invoke-Command. В блоке скрипта создается блок Param(), содержащий то же количество переменных, что и список значений -ArgumentList , который в данном случае является двумя. Обратите внимание, что можно назначить любые имена переменным в блоке Param( ). Они получат данные из параметра ArgumentList в зависимости от порядка. Другими словами, так как он был указан первым в $Log
, его значение будет передано, так как $x
это первая запись в блоке Param(). Затем переменные в блоке Param() можно использовать внутри блока скрипта, как показано в примере.
Этот синтаксис будет работать для Windows PowerShell версии 2.0 и более поздней версии. Однако в Windows PowerShell 3.0 появился упрощенный альтернативный подход. Если у вас есть локальная переменная $variable
и вы хотите включить ее содержимое в команду, которая будет выполняться на удаленном компьютере, можно выполнить следующую команду:
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
Префикс $Using:
правильно обрабатывается локальным и удаленными компьютерами, что приводит к замене $Using:variable
на содержимое локальной переменной $variable
.