2015-05-28 22 views
0

我可以在ScheduledJob中使用Start-Job嗎?無法重複接收作業中的輸出

下面是故事:我使用的是從​​,Remoting和Runspaces的.Net類在我的應用程序內部使用PowerShell Remoting。 我運行了一個腳本,在遠程主機上創建了一個ScheduledJob,它使用Hyper-V做了一些基本的工作,比如Restart-Vm。該操作本身按預期執行,就像我已經在此遠程主機上的控制檯中運行一樣。

雖然有一個區別 - 如果我把它放到控制檯,我會立即得到操作結果。例如,如果虛擬機處於禁用狀態,則會收到'虛擬機處於當前狀態時無法執行操作'。在SJ的情況下,當某些SJ觸發器被激活並且SJ運行時,我無法在收到它之後立即得到我的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行動,傳遞憑據,但沒有任何工程。

UPDATE 2015年6月5日

其實,這個問題從我的需要,以便捕獲Restart-Vm拋出的異常出現。我直到最近才意識到的事實是,當調用Restart-Vm時,我必須指定-ErrorAction Stop-ErrorVariable參數,以便我可以控制其執行。因此,再也不需要像嵌套工作那樣的黑客了。

+2

你如何獲得'$ res'? –

+0

$ res是從我的預定作業發起的作業中收到的數據,也是一份工作。它的狀態是'跑步'。我檢索它:$ res = Get-Job |接收-工作。而且我確保只有一份由Get-Job返回的工作 - 剛剛開始的工作。 –

+1

我不認爲你可以'Receive-Job'兩次 –

回答

1

執行語句$res = Get-Job | Receive-Job之後$res的值是從作業中收到的輸出。該輸出不是作業,可以再次輸入到Receive-Job

示範:

PS C:\>Start-Job -ScriptBlock { 'foo' } 

Id Name PSJobTypeName State HasMoreData Location Command 
-- ---- ------------- ----- ----------- -------- ------- 
6 Job6 BackgroundJob Running True   localhost 'foo' 

PS C:\>$res = Get-Job | Receive-Job 
PS C:\>$res 
foo 
PS C:\>$res | Receive-Job 
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...

你需要保持作業對象(或ID),如果你想獲得多次:

PS C:\>$job = Start-Job -ScriptBlock { 'foo' } 
PS C:\>$job | Receive-Job 
foo 
PS C:\>$job | Receive-Job 
PS C:\>Get-Job -Id $job.Id | Receive-Job 
PS C:\> _
+0

好的,謝謝,所以它似乎必須退出這種深奧的捕獲工作完成的想法。 –

+0

@VarvaraKalinina如果您想等待作業完成,請使用['Wait-Job'](https://technet.microsoft.com/zh-cn/library/hh849735.aspx)。 –

+0

是的,我會按照你的說法做,如果仍然有需要,請參閱我的帖子更新。無需嵌套作業了。 –