実験的機能 - ファイルとカラー設定

PowerShell 7.2で新しく導入された実験的機能の1つに、ファイルに対するカラー指定という機能がある。この機能は「PSAnsiRenderingFileInfo」と呼ばれており、扱いが簡単なわりに効果が期待できるので、ぜひ一度使ってみていただきたい。

デフォルトでは無効化されているので、使う場合は次のようにコマンドレットを実行してから、PowerShellを再起動する必要がある。

Enable-ExperimentalFeature -Name PSAnsiRenderingFileInfo

なお、有効化した機能を無効化するには、次のようにコマンドレットを実行してからPowerShellを再起動すればよい。

Disable-ExperimentalFeature -Name PSAnsiRenderingFileInfo

PowerShell 7.2ではターミナルにおけるカラー表示機能が強化されているので、PSAnsiRenderingFileInfoが有効化されているのか無効化されているのか、よくわからなくなってくるかもしれない。その場合、次のようにコマンドレットを実行すれば、有効/無効を確認することができる。

PS C:\Users\daichi> Get-ExperimentalFeature -Name PSAnsiRenderingFileInfo | Format-List

Name        : PSAnsiRenderingFileInfo
Enabled     : True
Source      : PSEngine
Description : Enable coloring for FileInfo objects


PS C:\Users\daichi>

ほかにも確認方法はある。例えば、PSAnsiRenderingFileInfoが無効化された状態で「dir」を実行すると次のようになる。ディレクトリに色は着いていない。

  • dirの実行サンプル

    dirの実行サンプル

これが、PSAnsiRenderingFileInfoを有効化した状態だと次のようになる。

  • dirの実行サンプル(PSAnsiRenderingFileInfoが有効な状態)

    dirの実行サンプル(PSAnsiRenderingFileInfoが有効な状態)

ディレクトリの表示が変わっていることがおわかりいただけるだろう。青地に白で表示されている。これがPSAnsiRenderingFileInfoの機能だ。

MacやLinuxではシェルやlsコマンドが個々にカラー表示機能を持っており、それぞれに設定方法や有効化の方法が異なっている。環境変数や変数での色指定、それに有効化するためのオプション指定や環境変数設定などだ。表示される色をそろえるには、それらを個別に全部設定する必要がある。

PowerShellの場合はPowerShellが機能を持つことになるわけだが、dirなども実際にはPowerShellのコマンドレットへのエイリアスであり、PowerShell自体が提供している機能だ。PSAnsiRenderingFileInfoによってさまざまなコマンドレットの挙動を変更することができるようになるものと見られる。

$PSStyle.FileInfo

PowerShell 7.2では「$PSStyle」でさまざまな色が設定できるようになった。次のように$PSStyleのメンバーを確認すると、フォントおよびカラーに関する設定情報を持っていることを確認できる。

PS C:\Users\daichi> $PSStyle | Get-Member

   TypeName: System.Management.Automation.PSStyle

Name             MemberType Definition
----             ---------- ----------
Equals           Method     bool Equals(System.Object obj)
FormatHyperlink  Method     string FormatHyperlink(string text, uri link)
GetHashCode      Method     int GetHashCode()
GetType          Method     type GetType()
ToString         Method     string ToString()
Background       Property   System.Management.Automation.PSStyle+BackgroundColor Background {get;}
Blink            Property   string Blink {get;}
BlinkOff         Property   string BlinkOff {get;}
Bold             Property   string Bold {get;}
BoldOff          Property   string BoldOff {get;}
FileInfo         Property   System.Management.Automation.PSStyle+FileInfoFormatting FileInfo {get;}
Foreground       Property   System.Management.Automation.PSStyle+ForegroundColor Foreground {get;}
Formatting       Property   System.Management.Automation.PSStyle+FormattingData Formatting {get;}
Hidden           Property   string Hidden {get;}
HiddenOff        Property   string HiddenOff {get;}
Italic           Property   string Italic {get;}
ItalicOff        Property   string ItalicOff {get;}
OutputRendering  Property   System.Management.Automation.OutputRendering OutputRendering {get;set;}
Progress         Property   System.Management.Automation.PSStyle+ProgressConfiguration Progress {get;}
Reset            Property   string Reset {get;}
Reverse          Property   string Reverse {get;}
ReverseOff       Property   string ReverseOff {get;}
Strikethrough    Property   string Strikethrough {get;}
StrikethroughOff Property   string StrikethroughOff {get;}
Underline        Property   string Underline {get;}
UnderlineOff     Property   string UnderlineOff {get;}

PS C:\Users\daichi>

PSAnsiRenderingFileInfoで使われる「$PSStyle.FileInfo」は上記コマンドレットで確認できるように$PSStyleに含まれている。$PSStyle.FileInfoのメンバーを確認すると、次のようになっている。

PS C:\Users\daichi> $PSStyle.FileInfo | Get-Member

   TypeName: System.Management.Automation.PSStyle+FileInfoFormatting

Name         MemberType Definition
----         ---------- ----------
Equals       Method     bool Equals(System.Object obj)
GetHashCode  Method     int GetHashCode()
GetType      Method     type GetType()
ToString     Method     string ToString()
Directory    Property   string Directory {get;set;}
Executable   Property   string Executable {get;set;}
Extension    Property   System.Management.Automation.PSStyle+FileInfoFormatting+FileExtensionDictionary Extension {get;}
SymbolicLink Property   string SymbolicLink {get;set;}

PS C:\Users\daichi>

プロパティで提供されているのが、利用できる実験的機能だ。整理すると次のようになる。

プロパティ 内容
$PSStyle.FileInfo.Directory ディレクトリへのカラー指定
$PSStyle.FileInfo.SymbolicLink シンボリックリンクへのカラー指定
$PSStyle.FileInfo.Executable 実行ファイルへのカラー指定
$PSStyle.FileInfo.Extension 異なるファイルエクステンションへのカラー指定(アーカイブとPowerShellファイルへの指定を含んでいる)

例えば、「$PSStyle.FileInfo.Directory」はディレクトリの色を指定するもので、調べてみると次のように文字列になっていることがわかる。

PS C:\Users\daichi> $PSStyle.FileInfo.Directory | Get-Member

   TypeName: System.String

Name                 MemberType            Definition
----                 ----------            ----------
Clone                Method                System.Object Clone(), System.Object ICloneable.Clone()
CompareTo            Method                int CompareTo(System.Object value), int CompareTo(string strB), int IComparable.Com…
Contains             Method                bool Contains(string value), bool Contains(string value, System.StringComparison co…
CopyTo               Method                void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count), …
EndsWith             Method                bool EndsWith(string value), bool EndsWith(string value, System.StringComparison co…
EnumerateRunes       Method                System.Text.StringRuneEnumerator EnumerateRunes()
Equals               Method                bool Equals(System.Object obj), bool Equals(string value), bool Equals(string value…
GetEnumerator        Method                System.CharEnumerator GetEnumerator(), System.Collections.IEnumerator IEnumerable.G…
GetHashCode          Method                int GetHashCode(), int GetHashCode(System.StringComparison comparisonType)
GetPinnableReference Method                System.Char&, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyTo…
GetType              Method                type GetType()
GetTypeCode          Method                System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
IndexOf              Method                int IndexOf(char value), int IndexOf(char value, int startIndex), int IndexOf(char …
IndexOfAny           Method                int IndexOfAny(char[] anyOf), int IndexOfAny(char[] anyOf, int startIndex), int Ind…
Insert               Method                string Insert(int startIndex, string value)
IsNormalized         Method                bool IsNormalized(), bool IsNormalized(System.Text.NormalizationForm normalizationF…
LastIndexOf          Method                int LastIndexOf(string value, int startIndex), int LastIndexOf(string value, int st…
LastIndexOfAny       Method                int LastIndexOfAny(char[] anyOf), int LastIndexOfAny(char[] anyOf, int startIndex),…
Normalize            Method                string Normalize(), string Normalize(System.Text.NormalizationForm normalizationFor…
PadLeft              Method                string PadLeft(int totalWidth), string PadLeft(int totalWidth, char paddingChar)
PadRight             Method                string PadRight(int totalWidth), string PadRight(int totalWidth, char paddingChar)
Remove               Method                string Remove(int startIndex, int count), string Remove(int startIndex)
Replace              Method                string Replace(string oldValue, string newValue, bool ignoreCase, cultureinfo cultu…
ReplaceLineEndings   Method                string ReplaceLineEndings(), string ReplaceLineEndings(string replacementText)
Split                Method                string[] Split(char separator, System.StringSplitOptions options), string[] Split(c…
StartsWith           Method                bool StartsWith(string value), bool StartsWith(string value, System.StringCompariso…
Substring            Method                string Substring(int startIndex), string Substring(int startIndex, int length)
ToBoolean            Method                bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte               Method                byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar               Method                char IConvertible.ToChar(System.IFormatProvider provider)
ToCharArray          Method                char[] ToCharArray(), char[] ToCharArray(int startIndex, int length)
ToDateTime           Method                datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal            Method                decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble             Method                double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16              Method                short IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32              Method                int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64              Method                long IConvertible.ToInt64(System.IFormatProvider provider)
ToLower              Method                string ToLower(), string ToLower(cultureinfo culture)
ToLowerInvariant     Method                string ToLowerInvariant()
ToSByte              Method                sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle             Method                float IConvertible.ToSingle(System.IFormatProvider provider)
ToString             Method                string ToString(), string ToString(System.IFormatProvider provider), string IConver…
ToType               Method                System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provi…
ToUInt16             Method                ushort IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32             Method                uint IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64             Method                ulong IConvertible.ToUInt64(System.IFormatProvider provider)
ToUpper              Method                string ToUpper(), string ToUpper(cultureinfo culture)
ToUpperInvariant     Method                string ToUpperInvariant()
Trim                 Method                string Trim(), string Trim(char trimChar), string Trim(Params char[] trimChars)
TrimEnd              Method                string TrimEnd(), string TrimEnd(char trimChar), string TrimEnd(Params char[] trimC…
TrimStart            Method                string TrimStart(), string TrimStart(char trimChar), string TrimStart(Params char[]…
TryCopyTo            Method                bool TryCopyTo(System.Span[char] destination)
Chars                ParameterizedProperty char Chars(int index) {get;}
Length               Property              int Length {get;}

PS C:\Users\daichi>

つまり、$PSStyle.FileInfo.Directoryに文字列で色を指定して使うということになる。

前景色と背景色の指定

では直接色を文字列で指定するのかと言うと、そうではない。$PSStyleに用意されている色指定である「$PSStyle.Foreground」と「$PSStyle.Background」を使う仕組みになっている。それぞれのメンバーは次のようになっている。

$PSStyle.Foregroundのメンバーを表示

PS C:\Users\daichi\Documents\powershell\20211204> $PSStyle.Foreground | Get-Member

   TypeName: System.Management.Automation.PSStyle+ForegroundColor

Name          MemberType Definition
----          ---------- ----------
Equals        Method     bool Equals(System.Object obj)
FromRgb       Method     string FromRgb(byte red, byte green, byte blue), string FromRgb(int rgb)
GetHashCode   Method     int GetHashCode()
GetType       Method     type GetType()
ToString      Method     string ToString()
Black         Property   string Black {get;}
Blue          Property   string Blue {get;}
BrightBlack   Property   string BrightBlack {get;}
BrightBlue    Property   string BrightBlue {get;}
BrightCyan    Property   string BrightCyan {get;}
BrightGreen   Property   string BrightGreen {get;}
BrightMagenta Property   string BrightMagenta {get;}
BrightRed     Property   string BrightRed {get;}
BrightWhite   Property   string BrightWhite {get;}
BrightYellow  Property   string BrightYellow {get;}
Cyan          Property   string Cyan {get;}
Green         Property   string Green {get;}
Magenta       Property   string Magenta {get;}
Red           Property   string Red {get;}
White         Property   string White {get;}
Yellow        Property   string Yellow {get;}

PS C:\Users\daichi\Documents\powershell\20211204>

$PSStyle.Backgroundのメンバーを表示

PS C:\Users\daichi\Documents\powershell\20211204> $PSStyle.Background | Get-Member

   TypeName: System.Management.Automation.PSStyle+BackgroundColor

Name          MemberType Definition
----          ---------- ----------
Equals        Method     bool Equals(System.Object obj)
FromRgb       Method     string FromRgb(byte red, byte green, byte blue), string FromRgb(int rgb)
GetHashCode   Method     int GetHashCode()
GetType       Method     type GetType()
ToString      Method     string ToString()
Black         Property   string Black {get;}
Blue          Property   string Blue {get;}
BrightBlack   Property   string BrightBlack {get;}
BrightBlue    Property   string BrightBlue {get;}
BrightCyan    Property   string BrightCyan {get;}
BrightGreen   Property   string BrightGreen {get;}
BrightMagenta Property   string BrightMagenta {get;}
BrightRed     Property   string BrightRed {get;}
BrightWhite   Property   string BrightWhite {get;}
BrightYellow  Property   string BrightYellow {get;}
Cyan          Property   string Cyan {get;}
Green         Property   string Green {get;}
Magenta       Property   string Magenta {get;}
Red           Property   string Red {get;}
White         Property   string White {get;}
Yellow        Property   string Yellow {get;}

PS C:\Users\daichi\Documents\powershell\20211204>

これを整理すると次のようになる。

指定 内容
$PSStyle.Foreground.Black 黒(前景色)
$PSStyle.Foreground.BrightBlack ブライト黒(前景色)
$PSStyle.Foreground.White 白(前景色)
$PSStyle.Foreground.BrightWhite ブライト白(前景色)
$PSStyle.Foreground.Red 赤(前景色)
$PSStyle.Foreground.BrightRed ブライト赤(前景色)
$PSStyle.Foreground.Magenta マジェンタ(前景色)
$PSStyle.Foreground.BrightMagenta ブライトマジェンタ(前景色)
$PSStyle.Foreground.Blue 青(前景色)
$PSStyle.Foreground.BrightBlue ブライト青(前景色)
$PSStyle.Foreground.Cyan シアン(前景色)
$PSStyle.Foreground.BrightCyan ブライトシアン(前景色)
$PSStyle.Foreground.Green 緑(前景色)
$PSStyle.Foreground.BrightGreen ブライト緑(前景色)
$PSStyle.Foreground.Yellow 黄(前景色)
$PSStyle.Foreground.BrightYellow ブライト黄(前景色)
$PSStyle.Background.FromRgb(R値,G値,B値) RGBで指定(前景色)
$PSStyle.Background.FromRgb(24ビット) RGBで指定(前景色)
指定 内容
$PSStyle.Background.Black 黒(背景色)
$PSStyle.Background.BrightBlack ブライト黒(背景色)
$PSStyle.Background.White 白(背景色)
$PSStyle.Background.BrightWhite ブライト白(背景色)
$PSStyle.Background.Red 赤(背景色)
$PSStyle.Background.BrightRed ブライト赤(背景色)
$PSStyle.Background.Magenta マジェンタ(背景色)
$PSStyle.Background.BrightMagenta ブライトマジェンタ(背景色)
$PSStyle.Background.Blue 青(背景色)
$PSStyle.Background.BrightBlue ブライト青(背景色)
$PSStyle.Background.Cyan シアン(背景色)
$PSStyle.Background.BrightCyan ブライトシアン(背景色)
$PSStyle.Background.Green 緑(背景色)
$PSStyle.Background.BrightGreen ブライト緑(背景色)
$PSStyle.Background.Yellow 黄(背景色)
$PSStyle.Background.BrightYellow ブライト黄(背景色)
$PSStyle.Background.FromRgb(R値,G値,B値) RGBで指定(背景色)
$PSStyle.Background.FromRgb(24ビット) RGBで指定(背景色)

FromRgbメソッドを使えばかなり細かく色を指定することもできるが、最初は用意されている「Red」や「Blue」、「Green」といったデフォルトの色で十分だろう。

使ってみよう

では早速、使ってみよう。使い方は簡単だ。PSAnsiRenderingFileInfoを有効化した状態で、色を設定すればよい。ディレクトリの前景色を赤にするのであれば、次のように設定する。

$PSStyle.FileInfo.Directory = $PSStyle.Foreground.Red

実行すると次のようになる。ディレクトリが赤で表示されていることを確認できると思う。

  • ディレクトリの表示を赤にしたところ

    ディレクトリの表示を赤にしたところ

前景色と背景色を同時に指定する場合は次のようにする。

$PSStyle.FileInfo.Directory = $PSStyle.Foreground.White + $PSStyle.Background.Blue
  • ディレクトリの背景を青、前景を白にした場合の実行結果

    ディレクトリの背景を青、前景を白にした場合の実行結果

カラー表示は視認性を高める上で役に立つ。設定を変更して、普段使っているLinuxのシェルやlsコマンドの色設定とPowerShellの色設定をそろえておくと、違和感なく使うことができるはずだ。

まだ実験段階ではあるが、便利な機能であり、デフォルト採用を阻害する大きな要因があるとも思えないので、いずれデフォルトの機能として使えるようになるのではないだろうか。

参考