我有一个使用自定义对象的脚本。我用这样的伪构造函数创建它们:
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
字段更改为其他字段吗?
稍后当我整理测试结果时,我将传递给另一个函数,有时候会是个别结果,有时候会产生一系列结果。我需要能够根据我得到的不同而做一些不同的事情。
感谢任何帮助。
答案 0 :(得分:10)
当然,在创建$ 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
...
答案 1 :(得分:0)
我创建了一个特殊的 cmdlet,用于在 powershell 下快速检测对象的类型名称。
对于自定义对象,.getType()
方法无法获取 ETS 类型名称。
function Get-PsTypeName {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true,
ValueFromPipeline = $true)]
$InputObject
)
begin {
}
process {
((Get-Member -InputObject $InputObject)[0].TypeName)
}
end {
}
}