2013-03-13 11 views
5

Ecco cosa mi piacerebbe ottenere in un modo o nell'altro.Passaggio dell'oggetto "nativo" ai lavori in background

Ho un assembly personalizzato che definisce alcuni oggetti. Nel mio script, creo un oggetto personalizzato che vorrei passare a un blocco di script, mantenendo il comportamento dell'oggetto.

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 

Come posso farlo o ottenere lo stesso effetto? Grazie per il tuo aiuto

risposta

7

Invece di processi in background è possibile utilizzare PowerShell con BeginInvoke, EndInvoke. Ecco l'esempio semplice, ma lavorando di passare un oggetto dal vivo in un "lavoro", cambiando lì, ottenendo i risultati:

# 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

I lavori in background sono basati sui servizi remoti di PowerShell e, come tali, eseguono azioni simili durante il passaggio degli oggetti. Avrebbero serializzato/deserializzato piuttosto che passarli con tutta la loro complessità.

La mia ipotesi è che l'unico modo per ottenere oggetto complesso è solo quello di passare gli argomenti e/o operazioni costruttore come -ArgumentList e creare l'oggetto all'interno lavoro.

In tal caso anche l'aggiunta di assemblaggio dovrebbe essere parte del lavoro:

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

Se l'oggetto è statefull ed è già stato cambiato è stati nello script chiamante, che non aiuterà C'è un'altra traccia rispetto alla serializzazione/deserializzazione? –

Problemi correlati