実験的機能 - ファイルとカラー設定
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」を実行すると次のようになる。ディレクトリに色は着いていない。
これが、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の色設定をそろえておくと、違和感なく使うことができるはずだ。
まだ実験段階ではあるが、便利な機能であり、デフォルト採用を阻害する大きな要因があるとも思えないので、いずれデフォルトの機能として使えるようになるのではないだろうか。