Изменение типа для объекта ConvertFrom-CSV - PullRequest
3 голосов
/ 24 февраля 2020

Я застрял на чем-то и не могу понять, в чем проблема. У меня есть команда, которая генерирует текст в формате CSV для вывода. Я успешно преобразовал вывод CSV в объект Powershell с помощью ConvertFrom-CSV. Все отлично работает! Я хотел применить некоторое произвольное форматирование, поэтому я хотел преобразовать объект в произвольное имя 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

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

Вы должны вставить свое имя типа ETS в коллекцию .PSTypeNames каждого объекта (он же .psobject.TypeNames):

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

В противном случае вы применяете имя типа только к массив в целом , который не имеет отношения к печати объектов один за другим .

1 голос
/ 24 февраля 2020

В какой-то момент вы настроили $GAMOBJ на Select-Object после установки имени пользовательского типа (обратите внимание, что имя типа, отображаемое Get-Member, равно Selected.System.Management.Automation.PSCustomObject)

Select-Object создает новый объект для вас, поэтому введенное вами имя нестандартного типа не сохраняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...