2013-03-13 2 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

Вместо фоновых заданий вы можете использовать PowerShell с BeginInvoke, EndInvoke. Вот простой, но работающий пример прохождения живого объекта в «работе», изменяя его там, получая результаты:

# 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

Если объект statefull и вы уже изменили его состояние в сценарии вызова, что не поможет. Есть ли другой трек, кроме сериализации/десериализации? –

Смежные вопросы