5

我有一个使用自定义对象的脚本。我用这样的伪构造函数创建它们:

function New-TestResult 
{
    $trProps = @{
        name = "";
        repo = @{};

        vcs   = $Skipped;

        clean = New-StageResult; # This is another pseudo-constructor
        build = New-StageResult; # for another custom object.
        test  = New-StageResult; #     - Micah

        start = get-date;
        finish = get-date;
    }

    $testResult = New-Object PSObject -Property $trProps
    return $testResult
}

这些很有用,因为它们可以传递给类似的东西ConvertTo-CsvConvertTo-Html(不像,说,哈希表,否则会实现我的目标)。它们被键入为PSCustomObject对象。这段代码:

$tr = new-testresult
$tr.gettype()

返回这个:

IsPublic IsSerial Name                     BaseType
-------- -------- ----                     --------
True     False    PSCustomObject           System.Object

我可以将Name那里返回的字段更改为其他字段PSCustomObject吗?

稍后当我整理测试结果时,我将传递给另一个函数,有时是单个结果,有时是一组结果。我需要能够做一些不同的事情,具体取决于我得到的那些。

任何帮助表示赞赏。

4

2 回答 2

11

当然,在创建 $testResult 后试试这个:

$testResult.psobject.TypeNames.Insert(0, "MyType")

PowerShell 扩展类型系统的核心是 psobject 包装器(至少在 V1 和 V2 中)。此包装器允许您添加属性和方法、修改类型名称列表并获取底层 .NET 对象,例如:

C:\PS > $obj = new-object psobject
C:\PS > $obj.psobject


BaseObject          :
Members             : {string ToString(), bool Equals(System.Object obj), int GetHashCode(), type GetType()}
Properties          : {}
Methods             : {string ToString(), bool Equals(System.Object obj), int GetHashCode(), type GetType()}
ImmediateBaseObject :
TypeNames           : {System.Management.Automation.PSCustomObject, System.Object}

或者从提示符尝试这个:

C:\PS> $d = [DateTime]::Now
C:\PS> $d.psobject
...
于 2012-10-02T00:09:27.920 回答
1

我创建了一个特殊的 cmdlet 来快速检测 powershell 下对象的类型名称。

对于自定义对象,.getType()Method 无法获取 ETS 类型名称。


function Get-PsTypeName {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true,
            ValueFromPipeline = $true)]
        $InputObject
    )
        
    begin {

    }
        
    process {
        ((Get-Member -InputObject $InputObject)[0].TypeName)
    }
        
    end {
    }
}
于 2021-01-05T23:39:23.580 回答