2013-03-13 25 views
5

以下是我希望以某种方式实现的内容。将“本地”对象传递给后台作业

我有一个自定义程序集来定义一些对象。在我的脚本中,我创建了一个我想传递给脚本块的自定义对象,以保持该对象的行为。

Add-Type -AssemblyName MyCustomDLL 

$global:object = new-object MyCustomDLL.MyCustomObject() 
$object | gm 

$jobWork = { param ($object) $object | gm } # I'd like to keep my object behavior in that block 

$job = Start-Job -ScriptBlock $jobWork -ArgumentList $object 
Wait-Job $job 
Receive-Job $job 

我该怎么做,或达到相同的效果?感谢您的帮助

回答

7

相反的后台作业您可以使用PowerShellBeginInvokeEndInvoke。这是通过一个活动对象的“工作”,改变它在那里,得到的结果简单,但工作示例:

# live object to be passed in a job and changed there 
$liveObject = @{ data = 42} 

# job script 
$script = { 
    param($p1) 
    $p1.data # some output (42) 
    $p1.data = 3.14 # change the live object data 
} 

# create and start the job 
$p = [PowerShell]::Create() 
$null = $p.AddScript($script).AddArgument($liveObject) 
$job = $p.BeginInvoke() 

# wait for it to complete 
$done = $job.AsyncWaitHandle.WaitOne() 

# get the output, this line prints 42 
$p.EndInvoke($job) 

# show the changed live object (data = 3.14) 
$liveObject 
3

后台作业构建在PowerShell远程处理之上,因此,在传递对象时执行类似的操作。他们会序列化/反序列化它们,而不是传递它们所有的复杂性。

我的猜测是获得复杂对象的唯一方法就是传递构造函数参数和/或操作-ArgumentList并在作业中创建对象

在这种情况下还加入大会将是工作的一部分:

Start-Job { 
    param ($ConstructorArguments) 
    Add-Type -AssemblyName MyCustomDll 
    $object = New-Object MyCustomDll.MyCustomObject $ConstructorArguments 
    $object | Get-Member 
} -ArgumentList Foo, Bar | Wait-Job | Receive-Job 
+0

如果对象是有状态的,你已经改变了它的状态在调用脚本,即将无济于事。有没有序列化/反序列化的轨道? – 2013-03-13 12:11:01

相关问题