オブジェクトの書式設定

通常、Get-ChildItemコマンドレットを実行すると次のように表示される。

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2005/12/25     15:06            Documents and Settings
d----        2005/07/29     10:21            Drivers
d----        2005/12/03     13:15            Inetpub
d-r--        2007/05/11     21:13            Program Files
d----        2006/12/30     18:38            temp
d----        2005/12/03     22:22            user
d----        2007/05/10     19:40            WINDOWS
-a---        2005/07/20     11:37          0 AUTOEXEC.BAT
-a---        2005/07/20     11:37          0 CONFIG.SYS

この表示がなんとなく気に入らなかったので、変えてみることにした。

PowerShellはコンソールに出力するオブジェクトの型毎に、それぞれ表示する属性(プロパティ)を設定ファイルで定義して標準の設定を置き換える事ができる。
手順としては、

  1. ps1xmlという拡張子のXML形式の書式設定ファイルを作成する。
  2. Update-FormatDataコマンドレットで書式設定ファイルを追加する。

書式設定ファイルの作成

filesystem.format.ps1xmlというファイル名で以下のファイルを作成する。

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
    <SelectionSets>
        <SelectionSet>
            <Name>FileSystemTypes</Name>
            <Types>
                <TypeName>System.IO.DirectoryInfo</TypeName>
                <TypeName>System.IO.FileInfo</TypeName>
                <TypeName>Deserialized.System.IO.DirectoryInfo</TypeName>
                <TypeName>Deserialized.System.IO.FileInfo</TypeName>
            </Types>
        </SelectionSet>
    </SelectionSets>
    
    <ViewDefinitions>
        <View>
            <Name>customFileSystem</Name>
            <ViewSelectedBy>
                <SelectionSetName>FileSystemTypes</SelectionSetName>
            </ViewSelectedBy>
            <TableControl>
                <TableHeaders>
                    <TableColumnHeader>
                        <Label>ファイル名</Label>
                        <Width>25</Width>
                        <Alignment>Left</Alignment>
                    </TableColumnHeader>
                    <TableColumnHeader>
                        <Label>サイズ</Label>
                        <Width>15</Width>
                        <Alignment>Right</Alignment>
                    </TableColumnHeader>
                    <TableColumnHeader>
                        <Label>作成日時</Label>
                        <Width>25</Width>
                        <Alignment>Right</Alignment>
                    </TableColumnHeader>
                    <TableColumnHeader>
                        <Label>更新日時</Label>
                        <Width>25</Width>
                        <Alignment>Right</Alignment>
                    </TableColumnHeader>
                </TableHeaders>
                <TableRowEntries>
                    <TableRowEntry>
                        <TableColumnItems>
                            <TableColumnItem>
                                <PropertyName>Name</PropertyName>
                            </TableColumnItem>
                            <TableColumnItem>
                                <PropertyName>Length</PropertyName>
                            </TableColumnItem>
                            <TableColumnItem>
                                <ScriptBlock>
                                    $_.CreationTime.ToString("yyyy年MM月dd日 hh時mm分")
                                </ScriptBlock>
                            </TableColumnItem>
                            <TableColumnItem>
                                <ScriptBlock>
                                    $_.LastWriteTime.ToString("yyyy年MM月dd日 hh時mm分")
                                </ScriptBlock>
                            </TableColumnItem>
                        </TableColumnItems>
                    </TableRowEntry>
                </TableRowEntries>
            </TableControl>
        </View>
    </ViewDefinitions>
</Configuration>

ViewDefinitions
  • View要素でオブジェクトの書式を定義する。Name要素にビュー名を設定する。
    • ViewSelectedBy要素でこの書式を適用するオブジェクトの型を指定する。
    • ここでは複数の型に適用する必要があるので、SelectionSets要素で事前に設定しておく。(FileInfoとDirectoryInfo)
TableControl
  • TableHeaders要素のTableColumnHeader要素で表示する列を定義する。
    • Name要素で列名、Width要素で横幅、Alignment要素で配置を定義する。
  • TableRowEntries要素のTableRowEntry要素で行を定義する。
    • TableColumnItems要素のTableColumnItem要素で列に表示するオブジェクトのプロパティを定義する。
      • PropertyName要素でプロパティ名を定義する。
      • PropertyName要素の代わりにScriptBlock要素でスクリプトを記述することもできる。

書式設定ファイルの追加

以下のコマンドを実行する。

Update-FormatData -PrependPath filesystem.format.ps1xml

出力結果

ファイル名                         サイズ                  作成日時                  更新日時
----------                         ------                  --------                  --------
Documents and Settings                     2005年07月20日 11時27分  2005年12月25日 03時06分
Drivers                                    2005年07月20日 08時27分  2005年07月29日 10時21分
Inetpub                                    2005年12月03日 01時13分  2005年12月03日 01時15分
Program Files                              2005年07月20日 11時29分  2007年05月11日 09時13分
temp                                       2006年10月21日 08時52分  2006年12月30日 06時38分
user                                       2005年12月03日 10時22分  2005年12月03日 10時22分
WINDOWS                                    2005年07月20日 08時20分  2007年05月11日 10時07分
AUTOEXEC.BAT                            0  2005年07月20日 11時37分  2005年07月20日 11時37分
CONFIG.SYS                              0  2005年07月20日 11時37分  2005年07月20日 11時37分

こんな感じで出力を自由にいじることができる。
後はこのコマンドをprofileスクリプトに記述しておけば、PowerShell起動時に毎回この書式設定ファイルが読み込まれる。