2011-03-03 79 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可能会导致问题。