1

MyStuff.DocumentPowerShellでテーブル (またはリスト) にカスタムタイプをContent表示すると、関数を使用してそのプロパティが表示されませんToString()。代わりに、PowerShell はコレクションを反復処理し、その中の項目を表示します。私のToString()機能を使ってほしい。

例:

$doc = New-Object MyStuff.Document
$doc.Content.Add("Segment 1")
$doc.Content.Add("Segment 2")

$doc | select Content

現在、次のように表示されます。

Content
-------
{Segment 1, Segment 2}

表示したいとき:

Content
-------
something custom

「何かカスタム」は私のToString()関数の出力です。

使用する必要があると思われるファイルを掘り下げました*.format.ps1xmlが、やりたいことを行う方法がわかりません。Update-TypeDataも有望に見えましたが、まだ運がありません。

どんな助けでも大歓迎です。

これらは私が取り組んでいるカスタムタイプです:

namespace MyStuff
{
    public class Document
    {
        public string Name { get; set; }
        public FormattedTextBlock Content { get; set; }
    }

    public class FormattedTextBlock : ICollection<FormattedTextSegment>
    {
        public void Add(string text)
        {
            this.Add(new FormattedTextSegment() { Text = text });
        }

        // ... ICollection implementation clipped

        public override string ToString()
        {
            // ... reality is more complex
            return "something custom";
        }
    }

    public class FormattedTextSegment
    {
        public string Text { get; set; }

        public override string ToString()
        {
            return Text;
        }
    }
}

アップデート

明確にするために、私は次のような戦略を認識してい$doc | select @{ Expression = { $_.Content.ToString() }; Label = "Content" }ます。デフォルトでプロパティをフォーマットする方法をPowerShellに伝える方法を探しています。

4

1 に答える 1

2

ここで 2 つの質問があります。

まず、Select -Property Contentあなたが実際にpowershellに伝えているのは、「さらに処理するために、選択したプロパティを持つ新しいオブジェクトをください」ということです。これは機能するため、パイプラインを続行できます。

第 2 に、パイプラインが終了し、データを配置する場所が他にない場合、書式設定の魔法が発生します。たとえば$doc | Select Content | format-table、現在表示されている表示が表示されます。format-tableただし、受け取るのは、動的タイプの PSCustomObjectですSelected.MyStuff.Document。このためのマジック タイプ情報を作成できますが、Selected.MyStuff.Document動的であるため、フォーマット情報が正しくない可能性が高くなります。

または、select の代わりに、$doc.Content.ToString()$doc が 1 つしかないと仮定したり、MyStuff.Documentオブジェクトのコレクションがある場合は$doc | % { $_.Content.ToString() }. これらは両方ともヘッダーを失います。

MyStuff.Document オブジェクト全体 (Select なし): をフォーマットする場合$doc | format-tableは、format.ps1xml ファイルで次を使用すると、魔法が起こります。MyStuff.Document タイプの Format-Table のみを実装したことに注意してください。FormattedTextBlock についても同様のことができるはずです。

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
    <ViewDefinitions>
        <View>
            <Name>MyStuff.Document</Name>
            <ViewSelectedBy>
                <TypeName>MyStuff.Document</TypeName>
            </ViewSelectedBy>
            <TableControl>
                <TableHeaders>
                    <TableColumnHeader>
                        <Label>Name</Label>
                    </TableColumnHeader>
                    <TableColumnHeader>
                        <Label>Content</Label>
                    </TableColumnHeader>
                </TableHeaders>
                <TableRowEntries>
                    <TableRowEntry>
                        <TableColumnItems>
                            <TableColumnItem>
                                <Alignment>Left</Alignment>
                                <PropertyName>Name</PropertyName>
                            </TableColumnItem>
                            <TableColumnItem>
                                <Alignment>Left</Alignment>
                                <ScriptBlock>$_.Content.ToString()</ScriptBlock> 
                            </TableColumnItem>
                        </TableColumnItems>
                    </TableRowEntry>
                </TableRowEntries>
            </TableControl>
        </View>
    </ViewDefinitions>
</Configuration>
于 2013-07-15T01:45:25.910 に答える