无法重复接收作业的输出
Can't repeatedly receive output from job
我可以在 ScheduledJob 中使用 Start-Job 吗?
故事是这样的:我在我的应用程序内部使用 PowerShell Remoting,使用来自 System.Management.Automation
的 .Net 类、Remoting 和 Runspaces。
我 运行 一个在远程主机上创建 ScheduledJob 的脚本,它使用 Hyper-V 做一些基本的事情,比方说,Restart-Vm
。该操作本身按预期执行,就像我在该远程主机的控制台中 运行 它一样。
尽管有一点不同——如果我将它放到控制台,我会立即得到操作结果。例如,如果 VM 被禁用,我将收到 'The operation cannot be performed while the virtual machine is in its current state'。对于 SJ,当某些 SJ 触发器被激活并且 SJ 运行s 时,我无法在收到 Restart-Vm
命令后立即获得它的结果。相反,我必须检查 SJ 被触发时创建的相应 BackgroundJob 并检查其状态并接收其结果。这不行,因为我的应用程序必须将此类事件写入远程计算机上的 EventLog。即使 Restart-Vm
操作没有成功,也不会抛出任何异常,而且我显然无法在预定作业的主体中写入 EventLog。
我认为解决方案可能是这样的:在预定作业中创建一个新作业,使该作业执行目标操作并将处理程序绑定到该作业的状态更改事件,该事件将写入 EventLog。
然而,当我实现这个
Start-Job -ScriptBlock { params($guid) Get-Vm $guid | Restart-Vm -Force; } -ArgumentList $id;
它失败了。它是这样发生的:SJ 被解雇,相应的 Job 被创建,我检查它的状态——它是 Completed 并且它 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
我已经尝试 运行使用 -AsJob
开关执行 Restart-Vm
操作,传递凭据,但没有任何效果。
2015 年 6 月 5 日更新
其实这个问题是因为我需要捕获Restart-Vm
抛出的异常而产生的。直到最近我才意识到我必须在调用 Restart-Vm
时指定 -ErrorAction Stop
或 -ErrorVariable
参数,这样我才能控制它的执行。因此,不再需要像嵌套作业这样的任何技巧。
执行语句$res = Get-Job | Receive-Job
后$res
的值是从作业接收到的输出。该输出不是可以再次输入 Receive-Job
的 工作 。
示范:
PS C:\> <b>Start-Job -ScriptBlock { 'foo' }</b>
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
6 Job6 BackgroundJob Running True localhost 'foo'
PS C:\> <b>$res = Get-Job | Receive-Job</b>
PS C:\> <b>$res</b>
foo
PS C:\> <b>$res | Receive-Job</b>
Receive-Job : The input object cannot be bound to any parameters for the command
either because the command does not take pipeline input or the input and its
properties do not match any of the parameters that take pipeline input.
At line:1 char:8
+ $res | Receive-Job
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (foo:PSObject) [Receive-Job], ...
+ FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Comman...
多次接收需保留job对象(或其ID):
PS C:\> <b>$job = Start-Job -ScriptBlock { 'foo' }</b>
PS C:\> <b>$job | Receive-Job</b>
foo
PS C:\> <b>$job | Receive-Job</b>
PS C:\> <b>Get-Job -Id $job.Id | Receive-Job</b>
PS C:\> _
我可以在 ScheduledJob 中使用 Start-Job 吗?
故事是这样的:我在我的应用程序内部使用 PowerShell Remoting,使用来自 System.Management.Automation
的 .Net 类、Remoting 和 Runspaces。
我 运行 一个在远程主机上创建 ScheduledJob 的脚本,它使用 Hyper-V 做一些基本的事情,比方说,Restart-Vm
。该操作本身按预期执行,就像我在该远程主机的控制台中 运行 它一样。
尽管有一点不同——如果我将它放到控制台,我会立即得到操作结果。例如,如果 VM 被禁用,我将收到 'The operation cannot be performed while the virtual machine is in its current state'。对于 SJ,当某些 SJ 触发器被激活并且 SJ 运行s 时,我无法在收到 Restart-Vm
命令后立即获得它的结果。相反,我必须检查 SJ 被触发时创建的相应 BackgroundJob 并检查其状态并接收其结果。这不行,因为我的应用程序必须将此类事件写入远程计算机上的 EventLog。即使 Restart-Vm
操作没有成功,也不会抛出任何异常,而且我显然无法在预定作业的主体中写入 EventLog。
我认为解决方案可能是这样的:在预定作业中创建一个新作业,使该作业执行目标操作并将处理程序绑定到该作业的状态更改事件,该事件将写入 EventLog。
然而,当我实现这个
Start-Job -ScriptBlock { params($guid) Get-Vm $guid | Restart-Vm -Force; } -ArgumentList $id;
它失败了。它是这样发生的:SJ 被解雇,相应的 Job 被创建,我检查它的状态——它是 Completed 并且它 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
我已经尝试 运行使用 -AsJob
开关执行 Restart-Vm
操作,传递凭据,但没有任何效果。
2015 年 6 月 5 日更新
其实这个问题是因为我需要捕获Restart-Vm
抛出的异常而产生的。直到最近我才意识到我必须在调用 Restart-Vm
时指定 -ErrorAction Stop
或 -ErrorVariable
参数,这样我才能控制它的执行。因此,不再需要像嵌套作业这样的任何技巧。
执行语句$res = Get-Job | Receive-Job
后$res
的值是从作业接收到的输出。该输出不是可以再次输入 Receive-Job
的 工作 。
示范:
PS C:\> <b>Start-Job -ScriptBlock { 'foo' }</b>
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
6 Job6 BackgroundJob Running True localhost 'foo'
PS C:\> <b>$res = Get-Job | Receive-Job</b>
PS C:\> <b>$res</b>
foo
PS C:\> <b>$res | Receive-Job</b>
Receive-Job : The input object cannot be bound to any parameters for the command
either because the command does not take pipeline input or the input and its
properties do not match any of the parameters that take pipeline input.
At line:1 char:8
+ $res | Receive-Job
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (foo:PSObject) [Receive-Job], ...
+ FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Comman...
多次接收需保留job对象(或其ID):
PS C:\> <b>$job = Start-Job -ScriptBlock { 'foo' }</b>
PS C:\> <b>$job | Receive-Job</b>
foo
PS C:\> <b>$job | Receive-Job</b>
PS C:\> <b>Get-Job -Id $job.Id | Receive-Job</b>
PS C:\> _