2011-03-03 172 views
2

我想運行一個腳本的15個實例,它們將5個腳本連接起來,到目前爲止,我錯過了精靈塵埃。我用一個主腳本來調試一個測試用例,該腳本調用一個從腳本,該腳本又調用一個sub_slave腳本(不需要管道來重現故障)* .ps1腳本可以作爲後臺作業自己執行* .ps1腳本嗎?

如果master.ps1調用slave.ps1每個後臺作業在slave.ps1調用sub_slave.ps1時無限期地掛起。如果我將slave.ps1中的調用註釋到sub_slave.ps1,則master.ps1會運行完成。如果我直接啓動slave.ps1,它會對sub_slave.ps1執行調用。問題似乎棘手,但如果我嘗試雙鏈。我沒有看到文檔中的任何內容說你不能將這些腳本通過任意深度連接成雛菊鏈,但也許我的閱讀不夠深入?

您會看到我正在通過腳本通過添加內容跟蹤簡單文本文件的進度。

d:\作業\ master.ps1

$indexes = @(0,1,2) 

$initString = "cd $pwd" 
$initCmd = [scriptblock]::create($initString) 

set-content -path out.txt -value "Master started" 
foreach ($index in $indexes) 
{ 
    add-content -path out.txt -value "job starting" 
    start-job -filepath slave.ps1 -InitializationScript $initCmd -ArgumentList @("master index $index originated") 
} 

add-content -path out.txt -value "master completed" 

d:\作業\ slave.ps1

#requires -version 2.0 

param (
    [parameter(Mandatory=$false)] 
    [string]$message = "slave_originated" 
) 

begin 
{ 
    Set-StrictMode -version Latest 
    add-content -path out.txt -value "slave beginning in $pwd" 
} 

process 
{ 
    add-content -path out.txt -value "slave processing $message" 
    invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 
} 

end 
{ 
    add-content -path out.txt -value "slave ending" 
} 

d:\作業\ sub_slave.ps1 #requires -version 2.0

param (
    [parameter(Mandatory=$false)] 
    [string]$message = "sub_slave originated" 
) 

begin 
{ 
    Set-StrictMode -version Latest 

    add-content -path out.txt -value "sub_slave beginning" 
} 

process 
{ 
    add-content -path out.txt -value "sub_slave processing $message" 
} 

end 
{ 
    add-content -path out.txt -value "sub_slave ending" 
} 

當代碼以書面形式運行時,沒有任何註釋掉,我在out.txt中得到了這個: d:\工作\ out.txt

Master started 
job starting 
job starting 
job starting 
master completed 
slave beginning in D:\jobs 
slave processing master index 0 originated 
slave beginning in D:\jobs 
slave processing master index 1 originated 
slave beginning in D:\jobs 
slave processing master index 2 originated 

注意,每個告別消息後第二天命令是sub_slave.ps1並沒有從sub_slave.ps1消息出現在所有的呼叫。該系統將掛起3個powershell.exe進程永遠愉快地運行。 Get-job報告3個進程仍然是Running和HasMoreData。

我得到的唯一線索是,如果我崩潰轉儲掛起的進程,我看到:

Number of exceptions of this type:  2 
Exception MethodTable: 79330e98 
Exception object: 012610fc 
Exception type: System.Threading.ThreadAbortException 
Message: <none> 
InnerException: <none> 
StackTrace (generated): 
<none> 
StackTraceString: <none> 
HResult: 80131530 
----------------- 

Number of exceptions of this type:  2 
Exception MethodTable: 20868118 
Exception object: 01870344 
Exception type: System.Management.Automation.ParameterBindingException 
Message: System error. 
InnerException: <none> 
StackTrace (generated): 
<none> 
StackTraceString: <none> 
HResult: 80131501 
----------------- 

也許我有一些類型的參數問題?如果我從sub_slave.ps1中刪除所有參數,則行爲不會改變,所以我有點懷疑,但這是可能的。我願意接受任何想法。

回答

3

您正在調用sub_slave.ps1錯誤。這:

invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 

應該是這樣的:

D:\jobs\sub_slave.ps1 -message $message 

的消息是越來越評價,併成爲多個參數。

+0

Grrrr。謝謝,傑森。我在25次試圖解決問題的過程中添加了invoke-expression,並且成功了。我在該行的某處添加了invoke-expression。如果我只是把它拿回來!我修改了我的測試工作以包含流水線,並且解決方案仍然成立,所以您已經完全回答了這個問題。謝謝。 – codepoke 2011-03-04 03:46:06

+1

Invoke-Expression總是有一個黃旗給我。這意味着將代碼轉換爲字符串,然後重新評估它。這可能會導致引用,參數綁定等問題。順便說一句,你原來的代碼沒有掛在我身上,所有三個作業完成失敗,但我得到了相同的日誌輸出。 – JasonMArcher 2011-03-04 17:47:15

+0

謝謝。事實證明,問題是在我編碼的服務器上關閉了遠程處理。我沒有在我的筆記本電腦上試過這個代碼,但是在應用你的mod之後它確實工作得很好,並且在服務器上仍然失敗。 WinRM給了我線索。 – codepoke 2011-03-07 03:00:45

0

只是在這裏猜測,但有多個線程/作業寫入同一個文件out.txt可能會導致問題。