Passing “native” object to background jobs

前端 未结 2 1909
盖世英雄少女心
盖世英雄少女心 2020-12-19 02:11

Here is what I\'d like to achieve in one way or another.

I have a custom assembly defining some objects. In my script, I create a custom object that I\'d like to pa

相关标签:
2条回答
  • 2020-12-19 03:04

    Instead of background jobs you may use PowerShell with BeginInvoke, EndInvoke. Here is the simple but working example of passing a live object in a "job", changing it there, getting the results:

    # 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
    
    0 讨论(0)
  • 2020-12-19 03:10

    Background jobs are built on top of PowerShell remoting and as such, perform similar actions when passing objects around. They would serialize/ deserialize them rather than pass them with all their complexity.

    My guess is that the only way to get complex object is just to pass constructor arguments and/ or operations as -ArgumentList and create object inside job.

    In such a case also adding assembly would have to be part of the job:

    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 讨论(0)
提交回复
热议问题