Могу ли я использовать Start-Job внутри ScheduledJob?Не удается получить результат с работы
Вот история: Я использую PowerShell Remoting из моего приложения, используя классы .Net от System.Management.Automation
, Remoting и Runspaces. Я запускаю скрипт, который создает ScheduledJob на удаленном хосте, который делает некоторые базовые вещи с Hyper-V, скажем, Restart-Vm
. Само действие выполняется так, как ожидалось, так же, как если бы я запускал его в консоли на этом удаленном хосте.
Хотя есть одно отличие - если бы я положил его на консоль, я сразу получил бы результаты операции. Например, если виртуальная машина отключена, я бы получил: «Операция не может быть выполнена, пока виртуальная машина находится в ее текущем состоянии». В случае с SJ, когда запускается какой-либо SJ-триггер и запускается SJ, у меня нет возможности получить результаты моей команды Restart-Vm
сразу же после ее получения. Вместо этого я должен проверить соответствующий BackgroundJob, который создается, когда SJ запускается, и проверяет его состояние и получает его результаты. Это не нормально, потому что мое приложение должно записывать события такого типа в EventLog на удаленном компьютере. Даже если операция Restart-Vm
не удалась, никакое исключение не выбрасывается, и я не могу явно записать в EventLog в теле моей запланированной работы.
Я думал, что решение может быть примерно таким: создайте новое задание внутри запланированного задания, сделайте это задание выполнимым целевым действием и привяжите обработчик к событию изменения состояния этого задания, которое будет записываться в EventLog.
Однако, когда я реализую это
Start-Job -ScriptBlock { params($guid) Get-Vm $guid | Restart-Vm -Force; } -ArgumentList $id;
он терпит неудачу. Вот как это происходит: SJ запускается, создается соответствующее задание, я проверяю его состояние - оно завершено и оно HasMoreData
. Когда я Receive-Job
я получаю эту ошибку
Receive-Job : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:8
+ $res | receive-job
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (System.Manageme...n.PSRemotingJob:PSObject) [Receive-Job], ParameterBindingEx
ception
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.ReceiveJobCommand
Я попытался запустить Restart-Vm
действие с -AsJob
переключателем, передавая полномочия, но ничего не работает.
UPDATE 5 июня 2015
На самом деле, эта проблема возникла из моей необходимости перехватывать исключения по Restart-Vm
. Тот факт, что до недавнего времени я не понимал, что должен указывать либо -ErrorAction Stop
, либо -ErrorVariable
при вызове Restart-Vm
, так что я могу получить контроль над его исполнением. Таким образом, нет необходимости в каких-либо хаках, таких как работа с гнездом больше.
Как получить '$ res'? –
$ res - это данные, полученные от задания, инициированного моей запланированной работой, и это тоже работа. Его состояние - «Бег». Я получаю его так: $ res = Get-Job | Receive-Job.И я убеждаюсь, что Get-Job - это только одна работа, которая только что началась. –
Я не думаю, что вы можете «Получить-Job» дважды –