Блок сценария Start-Job, как вызывать командлеты с аргументами?

Я новичок в командлете Start-Job, и у меня возникли проблемы с вызовом блока скрипта с командлетами, принимающими аргументы. Вот что у меня есть до сих пор:

    Start-Job -ScriptBlock {
       $ServiceObj = Get-Service -Name $ServiceName -ComputerName $Computer -ErrorAction Stop   
       Stop-Service -InputObj $ServiceObj -erroraction stop 
    }

Я вижу ошибки, когда запускаю receive-job, что аргумент -ComputerName равен нулю или пуст, а аргумент -InputObj равен нулю или пуст. Ни в том, ни в другом случае это не так. Фрагмент выше вызывается из двух циклов foreach:

foreach($Computer in $ComputerNames) {
  foreach($ServiceName in $ServiceNames) {
   #..call snippet above
  }
 }

Я пытался использовать -ArgumentList при вызове моего блока сценария, но и там не повезло. Я точно что-то упускаю?


person larryq    schedule 24.09.2012    source источник


Ответы (1)


Вам нужно использовать ArgumentList (если вы не используете PowerShell V3), например:

Start-Job -ScriptBlock {param($ComputerName)
   $ServiceObj = Get-Service -Name $ServiceName -CN $ComputerName -ErrorAction Stop
   Stop-Service -InputObj $ServiceObj -erroraction stop 
} -ArgumentList $Computer

Если вы используете PowerShell V3, вы можете использовать квалификатор переменной using, например:

Start-Job -ScriptBlock {
   $ServiceObj = Get-Service -Name $ServiceName -CN $using:Computer -ErrorAction Stop
   Stop-Service -InputObj $ServiceObj -erroraction stop 
}
person Keith Hill    schedule 24.09.2012
comment
Спасибо, Кит. Я забыл добавить бит param($..) в начале скрипта. Могу ли я спросить, как я могу передать переменную с splatted, при этом в дополнение к $Computer выше я также передаю переменную с именем FORCESTOP, определенную в основном скрипте следующим образом: $FORCESTOP = @{force=$force} - person larryq; 25.09.2012
comment
Разбрызгивание — это операция, которую вы выполняете с командлетом из хеш-таблицы. Просто передайте хеш-таблицу параметров, и затем вы сможете добавить эту хэш-таблицу к команде. Вы можете передать параметры по отдельности, например. params($ComputerName, [switch]$ForceStop)... - person Keith Hill; 25.09.2012