Передача "родного" объекта в фоновые задания

Вот то, чего я хотел бы достичь тем или иным способом.

У меня есть пользовательская сборка, определяющая некоторые объекты. В моем сценарии я создаю пользовательский объект, который я хотел бы передать в блок сценария, сохраняя поведение этого объекта.

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

Как я могу сделать это или достичь того же эффекта? Спасибо за вашу помощь

2 ответа

Решение

Вместо фоновых заданий вы можете использовать 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

Фоновые задания создаются поверх удаленного взаимодействия 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 
Другие вопросы по тегам