Пользовательская оснастка PowerShell: пользовательский формат не работает

Я использовал эту статью, чтобы написать свой первый командлет и оснастку Powershell. И это работает нормально.

Но я возвращаю набор объектов из своего собственного класса данных, который имеет четыре свойства, и я хочу, чтобы Powershell по умолчанию отображал только одно из этих свойств. Поэтому я использовал эту часть статьи для создания этого формата. файл:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
    <ViewDefinitions>
        <View>
            <Name>RemoteFile</Name>
            <ViewSelectedBy>
                <TypeName>MyFullNamespace.RemoteFileData</TypeName>
            </ViewSelectedBy>
            <TableControl>
                <TableHeaders>
                    <TableColumnHeader />
                </TableHeaders>
                <TableRowEntries>
                    <TableRowEntry>
                        <TableColumnItems>
                            <TableColumnItem>
                                <PropertyName>Filename</PropertyName>
                            </TableColumnItem>
                        </TableColumnItems>
                    </TableRowEntry>
                </TableRowEntries>
            </TableControl>
        </View>
    </ViewDefinitions>
</Configuration>

и свяжите его в оснастке:

    public override string[] Formats
    {
        get { return new string[] { "MyFormatFilename.ps1xml" }; }
    }

Но когда я устанавливаю оснастку с помощью installutil, использую Add-PSSnapin и вызываю мой командлет, отображаются все свойства объектов.

Что я делаю неправильно?


person Hinek    schedule 29.07.2010    source источник
comment
На всякий случай: знаете ли вы, что оснастки — это устаревший подход и предпочтительный (и более простой) способ — это модули? Я создал много модулей с добавлением любого пользовательского форматирования, и у меня никогда не было проблем. Н.Б. Это никоим образом не ответ на ваш вопрос, но, возможно, вы все же хотите попробовать модули, а не оснастки.   -  person Roman Kuzmin    schedule 29.07.2010
comment
@ Роман, нет, я этого не знал. У вас есть ссылка на учебник для модулей? Почему оснастки устарели? Microsoft использовала один для своих командлетов SharePoint 2010 ... звучит не так уж и древне для меня ...   -  person Hinek    schedule 29.07.2010
comment
Подход с оснастками не такой уж древний или устаревший, но они просто изобрели лучший способ — модули. Почему лучше? Просто потому, что их проще разрабатывать, настраивать и развертывать (установка xcopy). Вот ссылка MSDN: msdn.microsoft.com/en -us/library/dd878310(VS.85).aspx   -  person Roman Kuzmin    schedule 29.07.2010
comment
посмотрю, спасибо!   -  person Hinek    schedule 29.07.2010
comment
@hinek: оснастки — единственный выбор для powershell v1; ребята из sp2010 хотели совместимости с v1. модули предназначены только для powershell v2 (по умолчанию в Windows 7, 2008r2, но v2 также можно установить на xp/vista/2003)   -  person x0n    schedule 30.07.2010
comment
@Roman и @x0n: Спасибо за информацию о модулях, было интересно прочитать, к сожалению, моя первоначальная проблема не изменилась. :'(   -  person Hinek    schedule 30.08.2010


Ответы (1)


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

<TableColumnHeader>
  <Label>FileName</Label>
</TableColumnHeader>

Также убедитесь, что файл MyFormatFilename.ps1xml находится в том же каталоге, что и оснастка, когда она загружается через Add-PSSnapin. Кроме того, возможно, это глупо, но дважды проверьте наличие опечаток в имени типа, указанном в элементе <TypeName>.

Обновление: я попробовал ваш XML, как указано выше, и он работает для меня. Я скопировал его в Notepad2 и сохранил в C:\temp\test.ps1xml, а затем выполнил:

1# $obj = new-object psobject
2# $obj.psobject.TypeNames.Insert(0, 'MyFullNamespace.RemoteFileData')
3# Add-Member -InputObject $obj -MemberType NoteProperty -Name Filename `
              -Value 'some-remotefile.txt'
4# Add-Member -InputObject $obj -MemberType NoteProperty -Name Dummy `
              -Value 'dummy prop'
5# $obj.psobject.TypeNames
MyFullNamespace.RemoteFileData
System.Management.Automation.PSCustomObject
System.Object
6# $obj

Filename                                                    Dummy
--------                                                    -----
some-remotefile.txt                                         dummy prop


7# Update-FormatData C:\temp\test.ps1xml
8# $obj

Filename
--------
some-remotefile.txt

Я бы дважды проверил полное имя типа instance.GetType().FullName, а также дважды проверил содержимое файла формата. Убедитесь, что он находится в том же каталоге, из которого вы зарегистрировали оснастку.

person Keith Hill    schedule 29.07.2010
comment
Я пробовал это с «Label» и без него, но это не изменило результат ... также проверил «TypeName» и ps1xml в каталоге Snapin. TypeName — это тип отображаемых данных, а не тип командлета, верно? - person Hinek; 30.08.2010
comment
Привет, Кит, TypeName — это тип отображаемых данных, верно? Итак, если я верну данные в свой командлет, выполнив WriteObject(new RemoteFileData(...)); TypeName должно быть пространством имен и именем RemoteFileData, верно? - person Hinek; 31.08.2010
comment
Да, это правильно. После того, как ваша оснастка загружена, сделайте Get-FormatData -TypeName <full type name> для вашего типа и посмотрите, вносит ли он его в данные формата. Кроме того, запустите выходные данные вашего командлета через Get-Member и дважды проверьте полное имя типа. - person Keith Hill; 31.08.2010
comment
Забавно: когда я попробовал ваши предложения (кстати, спасибо), я обнаружил, что получаю правильно отформатированный вывод, когда я вызываю только свой командлет. Но если я сначала вызову Get-Help My-Cmdlet, а затем My-Cmdlet, он все равно вернет вывод, не следуя моему мнению... сумасшедший!? - person Hinek; 06.09.2010
comment
Да, это довольно безумно. Если вы сначала вызываете Get-Help My-Cmdlet, а затем Get-FormatData -Type <full type name>, отображаются ли ваши данные формата? - person Keith Hill; 06.09.2010