首页 > 解决方案 > 当 PSCustomObject 按预期返回时,Start-Job 未正确返回自定义类对象

问题描述

我遇到的问题并不是真正的障碍,而是在提取作业输出时序列化可能存在的错误(猜测?)。下面的代码是 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当它是 type 时它按预期工作的地方PSCustomObject,与ComputerResult上面定义的类对象不同。当脚本运行时, aGet-WmiObject -Class win32_printer -ComputerName $computername将一些 WMI 对象添加到 my$return_result.printerlist中,但是当返回时,将ComputerResult.printerlist返回一个字符串数组 - 带有__PATH属性的值。应该返回的是 WMI 对象。

PSCustomObject保留它的方法、属性等返回就好了。ComputerResult.printerlist保留完整的 WMI 对象。

我的假设是 PSCustomObject 在某种程度上与其他自定义类的处理方式不同,并且在序列化和管道返回主进程时可能使用不同的底层库。

为什么是这样?这是一个错误还是我误解了什么?

标签: powershell

解决方案


我用你的代码创建了一个函数,如下所示:

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。一切似乎都按预期工作。


推荐阅读