Start-Job не возвращает объект пользовательского класса должным образом, когда PSCustomObject возвращает, как предполагалось - PullRequest
0 голосов
/ 07 февраля 2020

Я столкнулся с проблемой, которая на самом деле не является помехой, но возможной ошибкой из-за сериализации при извлечении выходных данных задания (угадайте?). Приведенный ниже код представляет собой фрагмент из Start-Job, а затем записывает выходные данные foreach (Start-Job | Receive-Job)

class ComputerResult {
    $computerName
    $bldg
    $room
    $organization
    $user
    $lastUpdate
    $printerlist = @()
    $finalprinterlist = @()
}
# This one below doesn't work.    
$return_result = New-Object -TypeName ComputerResult

# This done does work.
$return_result = New-Object -TypeName PSCustomObject -Property @{ComputerName = ""; BLDG = ""; room = ""; organization = ""; user = ""; lastupdate = ""; printerlist = @(); finalprinterlist = @() }

# Here I would start assigning values to $return_result

# Once assigned, return from the Job process to await Receive-Job
return $return_result

Основной проблемой является $return_result, где он работает, как предполагалось, когда это тип PSCustomObject, в отличие от объекта класса ComputerResult, определенного выше. Когда скрипт запускается, Get-WmiObject -Class win32_printer -ComputerName $computername делается для добавления некоторых объектов WMI в мой $return_result.printerlist, но когда возвращается, ComputerResult.printerlist возвращает массив строк - со значениями свойства __PATH. То, что должно быть возвращено, является объектами WMI.

PSCustomObject прекрасно возвращается с сохранением его методов, свойств и т. Д. c. ComputerResult.printerlist хранится с полными объектами WMI.

Я предполагаю, что PSCustomObject каким-то образом обрабатывается не так, как остальные пользовательские классы, и, возможно, использует другую базовую библиотеку при сериализации и передаче обратно в основной процесс.

Почему это? Это ошибка или я что-то неправильно понимаю?

1 Ответ

0 голосов
/ 07 февраля 2020

Я создал функцию с вашим кодом следующим образом:

Function RetPrinter
{
    class ComputerResult {
        $computerName
        $bldg
        $room
        $organization
        $user
        $lastUpdate
        $printerlist = @()
        $finalprinterlist = @()
    }

    $return_result = New-Object -TypeName ComputerResult
    $return_result.PrinterList += gwmi win32_printer
    return $return_result
}

Затем я получил свой список принтеров следующим образом:

$Obj = RetPrinter

Путем передачи их в gm, $ Obj был возвращен как TypeName: ComputerResult, а $ ObjName.PrinterList был замечен как TypeName: System.Management.ManagementObject # root \ cimv2 \ Win32_Printer. Казалось, все работает как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...