実験的機能
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は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の新機能や変更点を知る上では重要な機能だ。新しいリリースごとにこれまで実験的だった機能のいくつかは正式な機能として取り込まれている。リリースはこうした機能をチェックし直す良いタイミングだ。