簡體   English   中英

*.ps1 腳本能否作為后台作業運行,自己執行 *.ps1 腳本?

[英]Can *.ps1 scripts run as background jobs themselves execute *.ps1 scripts?

我想運行一個腳本的 15 個實例,將 5 個腳本連接在一起,到目前為止我還沒有看到小精靈的灰塵。 我將問題歸結為一個測試用例,主腳本調用從屬腳本,而從屬腳本又調用 sub_slave 腳本(不需要管道來重現故障。)

如果 master.ps1 調用 slave.ps1,每個后台作業在 slave.ps1 調用 sub_slave.ps1 時無限期掛起。 如果我將 slave.ps1 中對 sub_slave.ps1 的調用注釋掉,master.ps1 將運行完成。 如果我直接啟動 slave.ps1,它會運行對 sub_slave.ps1 的調用就好了。 這個問題似乎難以解決,但如果我嘗試雙鏈。 我在文檔中沒有看到任何內容說您不能將這些腳本菊花鏈到任意深度,但也許我閱讀得不夠深入?

您會看到我通過將內容添加到一個簡單的文本文件來跟蹤腳本的進度。

d:\\jobs\\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:\\jobs\\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:\\jobs\\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:\\jobs\\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 個進程仍在運行和 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 中刪除所有參數,則行為不會改變,所以我有點懷疑,但這是可能的。 我願意接受任何想法。

您調用 sub_slave.ps1 是錯誤的。 這個:

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

應該是這樣的:

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

該消息正在得到評估並成為多個參數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM