Отправка параметров на удаленные компьютеры в 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.