【问题标题】:Changing Type on ConvertFrom-CSV object更改 ConvertFrom-CSV 对象的类型
【发布时间】:2020-02-24 13:23:11
【问题描述】:

我遇到了一些问题,无法弄清楚问题所在。我有一个生成 CSV 格式文本以供输出的命令。我已使用 ConvertFrom-CSV 成功地将 CSV 输出转换为 Powershell 对象。一切都很好!我想应用一些自定义格式,所以我想将对象转换为自定义 pstype 名称。我不能让它改变类型。 ConvertFrom-CSV 输出一个 PSCustomObject,所以我认为这很容易,但到目前为止还没有运气。

我的代码:

##This would be a function "get-devices" that creates command text and outputs the CSV output
##This all works properly
function get-devices {
     $Command.Invoke() | ConvertFrom-Csv
}
$GAMOBJ = get-devices
$GAMOBJ.PSObject.TypeNames.Insert(0,"System.Gam.Device")
$GAMOBJ

对象打印正确,但仍为PSCustomObject,因此格式不适用。我错过了什么?

任何帮助表示赞赏,在此先感谢。

这是 Get-Member 的输出:

       TypeName: Selected.System.Management.Automation.PSCustomObject

    Name        MemberType   Definition                                   
    ----        ----------   ----------                                   
    Equals      Method       bool Equals(System.Object obj)               
    GetHashCode Method       int GetHashCode()                            
    GetType     Method       type GetType()                               
    ToString    Method       string ToString()                            
    AssetID     NoteProperty System.String AssetID=ASSETID            
    Expiration  NoteProperty System.String Expiration=2000-01-01          
    Location    NoteProperty System.String Location=LOCATION          
    Model       NoteProperty System.String Model=CHROMEBOOKMODEL
    OU          NoteProperty System.String OU=/                           
    Serial      NoteProperty System.String Serial=123456                 
    Status      NoteProperty System.String Status=ACTIVE

下面有人补充说我已经使用 Select-Object 过滤了对象。我去掉了select对象,成员类型不变。

    TypeName: System.Management.Automation.PSCustomObject

【问题讨论】:

  • 它“打印正确”但“格式不适用” - 听起来像是矛盾的陈述 - 你能显示你得到的输出与你期望的输出吗? $GAMOBJ |Get-Member 的输出在这里也可能有用
  • 它打印正确,因为对象是从 CSV 输出创建的,但对象类型没有改变,所以我的自定义表不适用。
  • 这是 Get-Member TypeName 的输出:Selected.System.Management.Automation.PSCustomObject
  • 修改类型名称不会改变类型,但会影响格式化系统。 (请edit your original post 输出Get-Member 并打印输出)。此外,请仔细检查System.Gam.Device 的任何自定义格式数据是否实际存在于Get-FormatData -TypeName 'System.Gam.Device'
  • 完成。我已经使用 $var.PSObject.TypeName.Insert(0, 'TypeName') 来更改我创建的 PSCustomObject 的类型名,它工作得很好,但我无法得到这个。不会产生错误,只是不会更改类型名称。

标签: powershell csv


【解决方案1】:

您必须将您的 ETS 类型名称插入每个对象的 .PSTypeNames 集合(又名 .psobject.TypeNames):

$GAMOBJ.ForEach({ $_.PSTypeNames.Insert(0, "System.Gam.Device") })

否则,您只是将类型名称应用到整个数组,这与打印对象一个一个无关。

【讨论】:

    【解决方案2】:

    在设置自定义类型名称后,您在某个时间点将$GAMOBJ 传递到Select-Object(注意Get-Member 显示的类型名称是Selected.System.Management.Automation.PSCustomObject

    Select-Object 为您创建了一个新对象,这就是您插入的自定义类型名称不存在的原因。

    【讨论】:

    • 我在更改类型名称之前这样做了。我使用 select-object 因为对象中有多少属性。我已更新我的帖子以包含来自 Get-Member 的类型名,而无需使用 Select-Object。
    • 请确保您的示例代码确实重现了该问题(例如,将其复制粘贴到 powershell.exe 的新实例中) - 不可能 Get-Member 向您展示没有对象的类型名称由Select-Object 生成
    • 我已将其注释掉。对不起,我一定错过了什么。我完全删除了它,但输出是 system.management.automation.pscustomobject。
    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 2017-07-21
    • 1970-01-01
    • 2013-07-04
    • 2011-03-11
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多