2013-03-13 13 views
5

Folgendes möchte ich auf die eine oder andere Weise erreichen."natives" Objekt an Hintergrundjobs übergeben

Ich habe eine benutzerdefinierte Assembly, die einige Objekte definiert. In meinem Skript erstelle ich ein benutzerdefiniertes Objekt, das ich an einen Skriptblock übergeben möchte, wobei dieses Objektverhalten beibehalten wird.

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 

Wie kann ich das erreichen oder den gleichen Effekt erzielen? Vielen Dank für Ihre Hilfe

Antwort

7

Statt Hintergrundjobs Sie PowerShell mit BeginInvoke, EndInvoke verwenden. Hier ist die einfache, aber funktionierendes Beispiel für eine Live-Objekt in einem „Job“ vorbei, es gibt zu ändern, bekommen die Ergebnisse:

# 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

Hintergrundjobs basieren auf PowerShell-Remoting und führen daher ähnliche Aktionen beim Weiterleiten von Objekten aus. Sie würden sie serialisieren/deserialisieren, anstatt sie mit all ihrer Komplexität zu übergeben.

Meine Vermutung ist, dass der einzige Weg, um komplexes Objekt zu erhalten nur Konstruktor Argumente zu übergeben ist und/oder Operationen wie -ArgumentList und erstellen Objekt innerhalb Jobs.

In einem solchen Fall auch die Montage Zugabe würde ein Teil der Arbeit sein:

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

Wenn das Objekt zustandsbehaftete ist, und Sie haben sich bereits verändert es Staaten in das aufrufende Skript ist, dass wird nicht helfen. Gibt es einen anderen Track als serialisieren/deserialisieren? –

Verwandte Themen