为什么 PowerShell 的调用函数没有收到正确的对象类型?

Why is PowerShell's calling function not receiving the proper object type?

我正在使用 VMware PowerCLI 在 PowerShell 7.1.3 的 PowerShell 模块中对虚拟机执行一些操作。我看到对象类型有一些奇怪的行为。这是我正在做的事情的概要:

父函数。ps1:

function Parent-Function {
    $osCustomizationSpec = Child-Function -Name "AUTODEPLOY-ExampleConfiguration"
    Write-Verbose -Message $osCustomizationSpec.GetType()
}

这会将 System.Object[] 打印到详细流

子函数。ps1:

function Child-Function {
    param([Parameter][string]$Name)

    $osCustomizationSpec = Get-OSCustomizationSpec -Name $Name
    Write-Verbose -Message $osCustomizationSpec.GetType()
    return $osCustomizationSpec
}

这会将 VMware.VimAutomation.ViCore.Impl.V1.VIObjectImpl 打印到详细流

基本上,为什么调用函数将对象作为 System.Objects 的数组接收,而它应该作为 VMware.VimAutomation.ViCore.Impl.V1.VIObjectImpl 对象返回?

因为 PowerShell return 全部输出。你 returning .GetType() 然后 return。 PowerShell 会将其收集在一个数组中。

如果您 return 1 个对象,您将获得给定类型的标量值。 Return 超过 1 个对象,您将得到一个数组。

如果那些 .GetType() 调用是为了调试。在他们面前使用 Write-Host,例如:

Write-Host ( $osCustomizationSpec).GetType().FullName

这将写入控制台而不是输出流。