実験的機能

PowerShellではしばしば「実験的」と位置付けられる機能が導入される。こうした機能はデフォルトでは無効化されていることが多く、明示的に有効化すると試すことができる。試用期間を経て問題がなければどこかのリリースで正式な機能として取り込まれることになる。

前回紹介したファイル情報のカラー表示機能や引数解析機能なとは、PowerShell 7.2で新しく「実験的」な機能として取り込まれた機能だ。このため、デフォルトでは無効化されており、明示的に機能を有効化すると試すことができる。どちらの機能も使い勝手を良くする機能なので、正式な機能となる日が待ち望まれる。

PowerShell 7.2では、これまで「実験的」とされてきた機能のいくつかが正式な機能に昇格している。今回は、それらの機能について取り上げよう。

副作用なくKey-Valueファイル読み込む「Import-PowerShellDataFile」

ハッシュテーブルからKey-Valueデータを読み込む方法としては、「Invoke-Expression」コマンドレットを使うことができる。この方法で問題がないならそのまま使っていけばよいのだが、当然ながらInvoke-Expressionコマンドレットを使うとファイルに含まれているほかのコードも実行されることになる。

こういった場合に使用できるコマンドレットがPowerShell 7.2で正式機能となった「Import-PowerShellDataFile」コマンドレットだ。このコマンドレットはPSD1ファイルで定義されているハッシュテーブルからKey-Valueデータを読み込むためのもので、Invoke-Expressionコマンドレットとは違いファイルに含まれているほかのコードを実行しないという特徴がある。これまでKey-Valueデータを読み込む目的でInvoke-Expressionを使っていたのであれば、Import-PowerShellDataFileを使うように変えたほうが安全だ。

なお、Import-PowerShellDataFileはデフォルトでは500個が読み込む鍵の数の上限となっている。この上限以上のデータを読み込みたい場合にはImport-PowerShellDataFileコマンドレットにパラメータとして「SkipLimitCheck」を指定すればよい。デフォルトは「$false」なので、「$true」を指定すればよい。

ブレークポイント機能 - Disable-PSBreakpoint、Enable-PSBreakpoint、Get-PSBreakpoint、Remove-PSBreakpoint、Set-PSBreakpoint

ブレークポイントはプログラミング言語のデバッグ機能において重要なものだが、PowerShell 7.2ではこの機能をコマンドレットから簡単に操作できる。PowerShell 7.2で使えるのは次のコマンドレットだ。

  • Disable-PSBreakpoint
  • Enable-PSBreakpoint
  • Get-PSBreakpoint
  • Remove-PSBreakpoint
  • Set-PSBreakpoint

この機能については、「Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace - Using Experimental Features in PowerShell - PowerShell | Microsoft Docs」に掲載されている次のサンプルを見るとわかりやすいだろう。

Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspaceサンプル - Microsoft Docsより抜粋

Start-Job -ScriptBlock {
    Set-PSBreakpoint -Command Start-Sleep
    Start-Sleep -Seconds 10
}

$runspace = Get-Runspace -Id 1

$breakpoint = Get-PSBreakPoint -Runspace $runspace

上記サンプルでは、ジョブの中で「Set-PSBreakpoint」を使ってブレークポイントを設定している。ここでは「Start-Sleep」コマンドレットに対してブレークポイントが設定されているので、ブレークポイントの次の行で発動することになる。

このブレークポイントは、「Get-Runspace」でランスペースを取得し、そこからさらに「Get-PSBreakPoint」を経由してブレークポイントを取得できる。ブレークポイントは主にデバッグの目的で使うものなので、ある程度の規模のスクリプトを書くとか、ちょっと意味がわからない挙動を分析するとか、そういった目的がないと使うことはないかもしれない。こういった機能が正式な機能として導入された、といったくらいのことを把握しておけばよいと思う。

ANSIエスケープシーケンスのサポート $PSStyle

PowerShellはさまざまな方法でANSIのスケープシーケンスをサポートしている。エスケープシーケンスはターミナルにおいて出力をデコレーションする標準的な方法の一つだ。色指定(前景色、背景色、反転、点滅、非表示)や書体(ノーマル、太字、斜体、下線)などを指定することができる。

PowerShellがサポートしているのはxterm互換のエスケープシーケンスだ。WindowsであればWindows PowerShellやコマンドプロンプトといったWindows Consoleを使用するソフトウエアやWindows Terminalがxterm互換だ。Macのターミナルアプリもxterm互換だし、LinuxやUNIX系ターミナルアプリケーションの多くがxterm互換で動いている。

前回までに取り上げた通り、PowerShell 7.2にはこうしたスケープシーケンスをサポートする方法として新しく「$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>
  • $PSStyle 出力例

    $PSStyle 出力例

$PSStyleはRBG値による色指定にも対応しており、基本的には$PSStyleを使うことでほとんどの色を表現することができることになる。今後PowerShellではさらに多くのコマンドレットが$PSStyleによるカスタマイズに対応するだろうし、デフォルトのカラー出力も$PSStyleを使ったものに変更されていくんじゃないかと思う。

逆に、エスケープシーケンスによる色指定などを無効化したい場合には、NO_COLOR環境変数を指定するか、TERM環境変数をxterm-monoやxtermmに設定する(この操作は$PSStyle.OutputRenderingをPlainTextに設定するのと同じだ)。

ネイティブコマンドとエラーハンドリングの改善

ネイティブコマンド、特にLinux系のコマンドとの親和性がPowerShell 7.2では向上している。これまではネイティブコマンドから標準エラー出力に行われた出力は「$Error」や「$ErrorActionPreference」に反映されていた。しかし、Linux系コマンドのいくつかは標準エラー出力に追加情報なども出力しているため、標準エラー出力に出力があるからといって$Errorにデータを書き込むと、本来得たかったエラー情報が上書きされてしまうことになる。

PowerShell 7.2ではこの挙動が変更されており、ネイティブコマンドから標準エラー出力に出力があったとしても$Errorは上書きされないし、$ErrorActionPreferenceも影響を受けないようになった。今後PowerShellはコマンドレットのみならずネイテイブコマンドの利用も増えることが考えられる。この変更は良い方向へ進んでいると言えるだろう。

UNIX系OSでUNIX的なdir出力

これはWindowsには関係がないのだが、LinuxやMacといったUNIX系のOSでは、Get-ChildItemコマンドレットによるファイルのリスト表示がよりlsコマンドっぽくなった。そうしたOSではそもそも「dir (Get-ChildItem)」ではなく「ls」コマンドを直接実行するケースが多いのであまり影響はないかもしれないが、「そういったことができるようになった」ということは覚えておいてもよいだろう。

数値を文字列に変換するときの挙動を変更

「replace」演算子を使う場合、演算子の左側の値が数字など文字列ではなかった場合、演算時に自動的に文字列への変更が行われる。この文字列への変換だが、これまでは「[cultureinfo]::CurrentCulture」に設定されている値によって挙動が異なっていた。例えば、この値を「fr」に設定しておくと、「1.2 -replace ','」の結果は「1,2」となっていた。

PowerShell 7.2ではこの挙動が無効化される(PSCultureInvariantReplaceOperator)。[cultureinfo]::CurrentCultureがfrに設定されていても、「1.2 -replace ','」の結果は1.2だ。

実験的機能は結構便利

こんな感じで、PowerShell 7.2ではこれまで実験的機能と位置づけられていたもののいくつかが正式な機能としてメインストリームに取り込まれた。欲しかった機能が取り込まれたかたちであり、多くの方にとって喜ばしいはずだ。

実験的機能は全てがそのまま取り込まれるわけではないが、今後のPowerShellの新機能や変更点を知る上では重要な機能だ。新しいリリースごとにこれまで実験的だった機能のいくつかは正式な機能として取り込まれている。リリースはこうした機能をチェックし直す良いタイミングだ。

参考