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-Csvこれらは、またはのようなものに渡すことができるので便利ですConvertTo-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

PowerShellの下にあるオブジェクトの型名をすばやく検出するための特別なコマンドレットを作成しました。

カスタムオブジェクトの場合、.getType()メソッドは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 に答える