2020年11月11日、PowerShell 7.1の一般公開 を発表 しました。 PowerShell 7.0で築かれた基盤を基に、私たちの取り組みはコミュニティの問題に焦点を当て、多くの改善や修正を含んでいます。 PowerShellが安定し、パフォーマンスの高いプラットフォームであり続けることを約束します。
PowerShell 7.1には、以下の機能、アップデート、そして重大な変更が含まれています。
- PSReadLine 2.1.0(予測的IntelliSenseを含む)
- PowerShell 7.1はMicrosoft Storeに公開されました
- ARM64をサポートする新しいOSバージョン向けに更新されたインストーラーパッケージ
- 4つの新しい実験的特徴と2つの実験的特徴が主流に昇格
- 使いやすさを向上させるためのいくつかの変更点
変更の完全な一覧については、GitHub リポジトリの CHANGELOG を参照してください。
PSReadLine 2.1.0
PowerShell 7.1にはPSReadLine 2.1.0も含まれています。 このバージョンにはPredictive IntelliSenseが含まれています。 予測的IntelliSense機能の詳細については、PowerShellブログの 告知 をご覧ください。
Microsoft Store インストーラーパッケージ
PowerShell 7.1はMicrosoft Storeに公開されました。 PowerShellのリリースは Microsoft Store のウェブサイトやWindowsのStoreアプリケーションで見つけることができます。
Microsoft Store パッケージの利点:
- Windows に直接組み込まれた自動更新
- IntuneやSCCMなど他のソフトウェア配布メカニズムと統合されます
注
$PSHOMEに保存されたシステムレベルの設定は変更できません。 これには WSMAN 構成が含まれます。 これにより、リモート セッションが PowerShell のストアベース インストールに接続できなくなります。 ユーザーレベル構成と SSH リモート処理がサポートされています。
その他の設置業者
サポートされているオペレーティングシステムやサポートライフサイクルに関する up-to情報については、 PowerShellサポートライフサイクルをご覧ください。
お好みのOSのインストール手順を確認してください:
さらに、PowerShell 7.1はDebian、Ubuntu、ARM64のAlpine LinuxのARM32およびARM64バージョンをサポートしています。
公式にはサポートされていませんが、コミュニティは Arch やKali Linux向けのパッケージも提供しています。
注
Debian 10+、CentOS 8+、Ubuntu 20.04、Alpine、Armは現在、WinRMリモートをサポートしていません。 SSHベースのリモート設定の詳細については、「 PowerShell Remoting over SSH」をご覧ください。
試験的な機能
試験的特徴の詳細については、「試験的特徴を使用する
以下の実験的な特徴は、このリリースで主流の機能となっています。
このリリースでは以下の実験的な機能が追加されました:
Microsoft.PowerShell.Utility.PSManageBreakpointsInRunspace
- PowerShell 7.1はこの実験的な機能を拡張し、すべての
*-PSBreakpointコマンドレットにRunspaceパラメータを追加しています。 Runspaceパラメータは、指定されたランスペース内のブレークポイントと相互作用するRunspaceオブジェクトを指定します。
- PowerShell 7.1はこの実験的な機能を拡張し、すべての
PSNativePSPathResolution - この機能は、PowerShellのパス構文をサポートしないネイティブコマンドにPowerShellプロバイダーパスを渡すことができます。
PSCultureInvariantReplaceOperator -
-replace演算子文の左オペランドが文字列でない場合、そのオペランドは文字列に変換されます。 この機能を有効にすると、変換は文字列変換にCulture設定を使用しません。PSSubsystemPluginModel は、将来のPredictive IntelliSenseプラグインをサポートする基盤を築いています。
変更点と改善点
.NET 5.0で文字列比較の動作が変更されました
PowerShell 7.1は.NET 5.0を基に構築されており、以下の重大な変更が導入されました。
.NET 5.0以降、文化不変文字列比較は非印刷制御文字を無視します。
例えば、以下の2つの文字列は同一と考えられます:
# Escape sequence "`a" is Ctrl-G or [char]7 'Food' -eq "Foo`ad"Trueネイティブコマンドが
stderrに書き込み$?$falseしないよう修正(#13395)ネイティブコマンドが失敗を示す意図なしに
stderrに書き込みを行うことはよくあります。 この変更により、ネイティブコマンドにゼロでない終了コードがある場合にのみ$?が$falseに設定されます。 この変更は実験的特徴PSNotApplyErrorActionToStderrとは無関係です。ネイティブコマンドの出力に
$ErrorActionPreferencestderr影響しないようにしてください(#13361)ネイティブコマンドが失敗を示す意図なしに
stderrに書き込みを行うことはよくあります。 この変更により、出力stderrErrorRecordオブジェクトにはまだキャプチャされますが、ErrorRecordがネイティブコマンドから来ている場合$ErrorActionPreferenceランタイムは適用されません。Unixの時間入力を可能にするために
-FromUnixTimeをGet-Dateの上で-UnixTimeSecondsにリネームしてください(#13084)(ありがとうございます)@aetos382!)-FromUnixTimeパラメータは7.1からプレビュー.2の段階で追加されました。 パラメータはデータ型により合うように名前が変更されました。 このパラメータは整数の数値を取り、1970年1月1日 0:00:00 以降、秒単位で表されます。この例はUnix時間(1970-01-01 0:00:00以降の秒数で表される)をDateTimeに変換します。
Get-Date -UnixTimeSeconds 1577836800 Wednesday, January 01, 2020 12:00:00 AM明示的に指定された名前付きパラメータがハッシュテーブルスプラット(#13162)から同じパラメータに上書きできるようにする
この変更により、スプラッティングで付けられたパラメータはパラメータリストの最後に移動され、明示的に指定された名前付きパラメータがすべてバインドされた後にバウンディングされます。 単純な関数のパラメータバインディングは、指定された名前付きパラメータが見つからない場合にエラーを出しません。 未知の名前付きパラメータは単純関数の
$argsパラメータに縛られます。 スプラッティングを引数リストの最後に移動すると、パラメータの出現順が変わり$args。例えば次が挙げられます。
function SimpleTest { param( $Name, $Path ) "Name: $Name; Path: $Path; Args: $args" }前述の動作では、 MyPath は引数リストの3番目の引数であるため
-Pathに縛られません。 ## だから結局『$args』に詰め込まれてしまいますBlah = "World"PS> $hash = @{ Name = "Hello"; Blah = "World" } PS> SimpleTest @hash "MyPath" Name: Hello; Path: ; Args: -Blah: World MyPathこの変更により、
@hashの引数は引数リストの最後に移動されます。 MyPath がリストの最初の引数になるので、それは-Pathに縛られます。PS> SimpleTest @hash "MyPath" Name: Hello; Path: MyPath; Args: -Blah: Worldスイッチパラメータを位置決め
-QualifierSplit-Path(#12960)にしてください(ありがとうございます)@yecril71pl!)指定されていない場合は、作業ディレクトリを
Start-Processのリテラルパスとして解決してください(#11946)(ありがとうございます) @NoMoreFood!)ウェブコマンドレットのパラメータ
-OutFile-LiteralPathのように動作させる(#11701)(ありがとう)@iSazonov!)数値リテラルの文字列パラメータバインディング
BigInteger修正(#11634)(ありがとう) @vexx32!)Windowsでは、
Start-Process現在のセッションのすべての環境変数でプロセス環境を作成し、-UseNewEnvironmentを使って新しいデフォルトのプロセス環境(#10830)を作成します(ありがとうございます) @iSazonov!)ScriptBlockを代理に変換する際、リターン結果PSObjectをラップしない(#10619)ScriptBlockがC#コンテキストで使用されるデリゲート型に変換されると、結果をラッピングPSObjectすると不要なトラブルが生じます:- 値が代理リターン型に変換されると、
PSObjectは実質的にアンラップされます。 だからPSObjectは不要です。 - デリゲートリターン型が
objectされると、PSObjectでラップされてしまい、C#コードでの扱いが難しくなります。
この変更の後、返されたオブジェクトが基礎となるオブジェクトとなります。
- 値が代理リターン型に変換されると、