PowerShell の試験的機能の使用

PowerShell の試験的機能のサポートは、試験的機能を PowerShell または PowerShell モジュールの既存の安定した機能と共存させるためのメカニズムを提供します。

試験的機能は、設計が未完成である機能です。 この機能は、ユーザーがテストしてフィードバックを提供するために使用できます。 試験的機能が完成すると、設計の変更が破壊的変更になります。

注意事項

試験的機能は、変更が破壊的になる可能性があるため、運用環境で使用することは想定されていません。 試験的機能は正式にはサポートされていません。 しかし、フィードバックとバグ レポートは歓迎いたします。 GitHub ソース リポジトリでイシューを送信できます。

これらの機能を有効または無効にする方法の詳細については、「about_Experimental_Features」を参照してください。

試験的機能のライフサイクル

Get-ExperimentalFeature コマンドレットは、PowerShell で使用できるすべての試験的機能を返します。 試験的機能は、モジュールまたは PowerShell エンジンから取得できます。 モジュール ベースの試験的機能は、モジュールをインポートした後にのみ使用できます。 次の例では、PSDesiredStateConfiguration が読み込まれていないため PSDesiredStateConfiguration.InvokeDscResource 機能は使用できません。

Get-ExperimentalFeature
Name                             Enabled Source   Description
----                             ------- ------   -----------
PSCommandNotFoundSuggestion        False PSEngine Recommend potential commands based on fuzzy searc…
PSCommandWithArgs                  False PSEngine Enable `-CommandWithArgs` parameter for pwsh
PSFeedbackProvider                  True PSEngine Replace the hard-coded suggestion framework with …
PSLoadAssemblyFromNativeCode       False PSEngine Expose an API to allow assembly loading from nati…
PSModuleAutoLoadSkipOfflineFiles    True PSEngine Module discovery will skip over files that are ma…
PSSubsystemPluginModel              True PSEngine A plugin model for registering and un-registering…

機能を有効または無効にするには、Enable-ExperimentalFeature コマンドレットと Disable-ExperimentalFeature コマンドレットを使用します。 この変更を有効にするには、新しい PowerShell セッションを開始する必要があります。 次のコマンドを実行して、PSCommandNotFoundSuggestion 機能を有効にします:

Enable-ExperimentalFeature PSCommandNotFoundSuggestion
WARNING: Enabling and disabling experimental features do not take effect until next start
of PowerShell.

試験的機能がメインストリームになると、機能が PowerShell エンジンまたはモジュールの一部になるため、試験的な能として使用できなくなります。 たとえば、PowerShell 7.3 では PSAnsiRenderingFileInfo 機能がメインストリームになりました。 機能は自動的に取得されます。

Note

一部の機能には、基本設定変数などの構成要件があり、機能から目的の結果を取得するために設定する必要があります。

試験的機能が 廃止されると、その機能は PowerShell で使用できなくなります。 たとえば、PSNativePSPathResolution 機能は PowerShell 7.3 で廃止されました。

利用可能な機能

この記事では、使用可能な試験的機能と、その機能の使用方法について説明します。

凡例

  • 実験 アイコンは、PowerShell のバージョンで実験的機能を利用できることを示します
  • メインストリーム アイコンは、実験的機能がメインストリームになった PowerShell のバージョンを示します
  • 廃止アイコンは、実験的機能が取り除かれた PowerShell のバージョンを示します
名前 7.2 7.3 7.4 7.5 (preview)
PSCommandNotFoundSuggestion Experimental Experimental Experimental Experimental
PSDesiredStateConfiguration.InvokeDscResource Experimental Experimental Experimental Experimental
PSNativePSPathResolution Experimental Discontinued
PSSubsystemPluginModel Experimental Experimental Experimental Experimental
PSNativeCommandArgumentPassing Experimental メインストリーム
PSAnsiRenderingFileInfo Experimental メインストリーム
PSLoadAssemblyFromNativeCode Experimental Experimental Experimental Experimental
PSNativeCommandErrorActionPreference Experimental メインストリーム
PSFeedbackProvider Experimental Experimental
PSModuleAutoLoadSkipOfflineFiles Experimental Experimental
PSCommandWithArgs Experimental Experimental
PSNativeWindowsTildeExpansion Experimental

PSAnsiRenderingFileInfo

Note

この機能は、PowerShell 7.3 でメインストリームになりました。

ANSI 書式設定機能は、PowerShell 7.2 で追加されました。 この機能により、$PSStyle.FileInfo メンバーが追加され、特定のファイルの種類の色分けが有効になります。

  • $PSStyle.FileInfo.Directory - ディレクトリの色を指定する組み込みメンバー
  • $PSStyle.FileInfo.SymbolicLink - シンボリック リンクの色を指定する組み込みメンバー
  • $PSStyle.FileInfo.Executable - 実行可能ファイルの色を指定する組み込みメンバー
  • $PSStyle.FileInfo.Extension - このメンバーを使用して、さまざまなファイル拡張子の色を定義します。 Extension メンバーには、アーカイブと PowerShell ファイルの拡張機能があらかじめ含まれています。

詳細については、「about_Automatic_Variables」を参照してください。

PSCommandNotFoundSuggestion

CommandNotFoundException 後にあいまい一致検索に基づいて、可能性のあるコマンドを推奨します。

PS> get
get: The term 'get' isn't recognized as the name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.

Suggestion [4,General]: The most similar commands are: set, del, ft, gal, gbp, gc, gci,
gcm, gdr, gcs.

PSCommandWithArgs

この機能により、pwsh-CommandWithArgs パラメーターが有効になります。 このパラメーターを使用すると、引数を使用して PowerShell コマンドを実行できます。 -Command とは異なり、このパラメーターは コマンドで使用できる $args 組み込み変数を設定します。

最初の文字列はコマンドで、後続の文字列は空白で区切られた引数です。

次に例を示します。

pwsh -CommandWithArgs '$args | % { "arg: $_" }' arg1 arg2

この例を実行すると、次の出力が生成されます。

arg: arg1
arg: arg2

この機能は、PowerShell 7.4-preview.2 で追加されました。

PSDesiredStateConfiguration.InvokeDscResource

Windows 以外のシステムで MOF へのコンパイルを有効にし、LCM を使用せずに Invoke-DSCResource を使用できるようにします。

PowerShell 7.2 以降では、PSDesiredStateConfiguration モジュールが削除され、この機能が既定で無効になっています。 この機能を有効にするには、PowerShell ギャラリーから PSDesiredStateConfiguration v2.0.5 モジュールをインストールし、この機能を有効にする必要があります。

DSC v3 には、この試験的な機能はありません。 DSC v3 では Invoke-DSCResource のみがサポートされ、MOF コンパイルは使用もサポートもされません。 詳細については、PowerShell Desired State Configuration v3 を参照してください。

PSFeedbackProvider

この機能を有効にすると、PowerShell はコマンドが見つからないときに、新しいフィードバック プロバイダーを使用してフィードバックを提供します。 フィードバック プロバイダーは拡張可能であり、サード パーティのモジュールで実装できます。 このフィードバック プロバイダーは、IntelliSense の予測結果を提供するために、予測サブシステムなどの他のサブシステムでも使用できます。

この機能には、次の 2 つの組み込みのフィードバック プロバイダーが含まれています。

  • GeneralCommandErrorFeedback は、現在存在するのと同じ提案機能を提供します

  • UnixCommandNotFound は Linux で使用でき、bash に似たフィードバックを提供します。

    UnixCommandNotFound は、フィードバック プロバイダーと予測提供者の両方として機能します。 command-not-found コマンドからの提案は、対話型の実行でコマンドが見つからないときにフィードバックを提供するときと、次のコマンド ラインに IntelliSense の予測結果を提供したりするときの両方に使用できます。

この機能は、PowerShell 7.4-preview.3 で追加されました。

PSLoadAssemblyFromNativeCode

ネイティブ コードからのアセンブリの読み込みを許可する API を公開します。

PSModuleAutoLoadSkipOfflineFiles

この機能を有効にすると、ユーザーの PSModulePath に OneDrive などのクラウド プロバイダーのフォルダーが含まれている場合、PowerShell はそのフォルダーに含まれるすべてのファイルのダウンロードをトリガーしなくなります。 ダウンロードされていないとマークされたファイルはすべてスキップされます。 クラウド プロバイダーを使用してマシン間でモジュールを同期するユーザーは、モジュール フォルダーをピン留め済みまたは OneDrive 以外のプロバイダーの同等の状態としてマークする必要があります。 モジュール フォルダーをピン留め済みに設定すると、ファイルは常にディスクに保持されます。

この機能は、PowerShell 7.4-preview.1 で追加されました。

PSNativeCommandArgumentPassing

Note

この機能は、PowerShell 7.3 でメインストリームになりました。

この実験的な機能が有効になっていると、PowerShell は、ネイティブの実行可能ファイルを呼び出すときに、文字列を再構築する現在の機構ではなく、StartProcessInfo オブジェクトの ArgumentList プロパティを使用します。

注意事項

新しい動作は、現在の動作からの破壊的変更です。 これにより、ネイティブ アプリケーションを呼び出す際のさまざまな問題に対処するスクリプトと自動化が中断される場合があります。 歴史的に、引用符をエスケープする必要があり、ネイティブ アプリケーションに空の引数を指定することはできません。 必要に応じて、stop-parsing トークン (--%) または Start-Process コマンドレットを使用して、ネイティブ引数の受け渡しをサイドステップします。

この機能により、この動作を制御する新しい $PSNativeCommandArgumentPassing 基本設定変数が追加されます。 この変数により、ランタイム時の動作を選択することができます。 有効な値は、LegacyStandardWindows です。 既定の動作は、プラットフォームに固有です。 Windows プラットフォームの場合、既定の設定は Windows で、Windows 以外のプラットフォームでは既定で Standard です。

Legacy は過去の動作です。 Windows および Standard モードの動作は同じですが、Windows モードでは、次のファイルの呼び出しで Legacy スタイル引数の受け渡しが自動的に使用されます。

  • cmd.exe
  • find.exe
  • cscript.exe
  • wscript.exe
  • sqlcmd.exe - PowerShell 7.3.1 で追加
  • .bat で終わる
  • .cmd で終わる
  • .js で終わる
  • .vbs で終わる
  • .wsf で終わる

$PSNativeCommandArgumentPassingLegacy または Standard のいずれかに設定されている場合、パーサーはこれらのファイルのチェックは行いません。

既定の動作は、プラットフォームに固有です。 Windows プラットフォームの場合、既定の設定は Windows で、Windows 以外のプラットフォームでは Standard です。

注意

次の例では、TestExe.exe ツールを使用します。 ソース コードから TestExe をビルドすることができます。 PowerShell ソース リポジトリの TestExe に関するページを参照してください。

この変更によって利用可能になった新しい動作は次のとおりです。

  • リテラルまたは展開可能な文字列に引用符が埋め込まれ、その引用符が保持されます。

    PS> $a = 'a" "b'
    PS> TestExe -echoargs $a 'c" "d' e" "f
    Arg 0 is <a" "b>
    Arg 1 is <c" "d>
    Arg 2 is <e f>
    
  • 空の文字列が引数として保持されます。

    PS> TestExe -echoargs '' a b ''
    Arg 0 is <>
    Arg 1 is <a>
    Arg 2 is <b>
    Arg 3 is <>
    

新しい動作のその他の例については、「about_Parsing」を参照してください。

PowerShell 7.3 では、ネイティブ コマンドのパラメーター バインドをトレースする機能も追加されました。 詳しくは、「トレース-コマンド」をご覧ください。

PSNativeCommandErrorActionPreference

Note

この機能は、PowerShell 7.4 でメインストリームになりました。

ネイティブ コマンドは、通常、呼び出し元のアプリケーションに対して、成功した場合は 0、失敗した場合は 0 以外の終了コードを返します。 ただし、現在のところ、ネイティブ コマンドは、PowerShell エラー ストリームに参加していません。 リダイレクトされた stderr 出力が、PowerShell エラー ストリームと同じように解釈されることはありません。 多くのネイティブ コマンドでは、stderr を、情報または詳細ストリームとして使用するため、終了コードのみが重要となります。 スクリプトでネイティブ コマンドを使用するユーザーは、次の例に似たものを使用して、各呼び出しの後で終了ステータスをチェックする必要があります。

if ($LASTEXITCODE -ne 0) {
    throw "Command failed. See above errors for details"
}

ただし、この例では、コマンドレットまたは関数のエラーにより $? が false となり、$LASTEXITCODE が古くなる可能性のあるすべてのケースがサポートされるわけではありません。

この機能は、PowerShell でのネイティブ コマンド エラーの処理方法を制御する $PSNativeCommandUseErrorActionPreference ユーザー設定変数を実装します。 これにより、ネイティブ コマンド エラーによって、PowerShell エラー ストリームに追加され、余分な処理を行わずにスクリプトの実行を終了させることができるエラー オブジェクトを生成できます。

既定では、$PSNativeCommandUseErrorActionPreference$false に設定されています。 ユーザー設定を $true に設定すると、次の動作が得られます。

  • $ErrorActionPreference = 'Stop' の場合、ネイティブ コマンドが 0 以外の終了コードを返すと、スクリプトは中断されます。
  • $ErrorActionPreference = 'Continue' (既定値) の場合、ネイティブ コマンド エラーの PowerShell エラー メッセージが表示されますが、スクリプトは中断されません。

PSNativePSPathResolution

Note

この試験的機能は PowerShell 7.3 で削除され、サポートされていません。

FileSystem プロバイダーを使用する PSDrive パスがネイティブ コマンドに渡されると、解決されたファイル パスがネイティブ コマンドに渡されます。 これは、code temp:/test.txt のようなコマンドが期待どおりに動作することを意味します。

また、Windows の ~ で始まるパスは、完全なパスに解決され、ネイティブ コマンドに渡されます。 どちらの場合も、パスは、関連するオペレーティング システムのディレクトリ区切り記号に正規化されます。

  • パスが PSDrive または ~ (Windows) でない場合、パスの正規化は行われません
  • パスが単一引用符で囲まれている場合、そのパスは解決されず、リテラルとして扱われます

PSSubsystemPluginModel

この機能により、PowerShell でサブシステム プラグイン モデルが有効になります。 この機能により、System.Management.Automation.dll のコンポーネントを、独自のアセンブリに存在する個々のサブシステムに分けることができます。 この分割により、コア PowerShell エンジンのディスク占有領域が削減され、これらのコンポーネントを最小限の PowerShell インストールに対するオプション機能にすることができます。

現時点では、CommandPredictor サブシステムのみがサポートされています。 このサブシステムは、カスタム予測プラグインを提供するために、PSReadLine モジュールと共に使用されます。 今後、JobCommandCompleterRemoting などのコンポーネントは、System.Management.Automation.dll 外のサブシステム アセンブリに分割される可能性があります。

この試験的機能には、新しいコマンドレット Get-PSSubsystem が含まれています。 このコマンドレットは、機能が有効になっている場合にのみ使用できます。 このコマンドレットを使用すると、システムで使用可能なサブシステムに関する情報が返されます。

PSNativeWindowsTildeExpansion

この機能が有効になっている場合、PowerShell では、ネイティブ コマンドを呼び出す前に、引用符で囲まれていないチルダ (~) がユーザーの現在のホーム フォルダーに展開されます。 次の例はこの機能のしくみを示しています。

この機能を無効にすると、チルダはリテラル文字列としてネイティブ コマンドに渡されます。

PS> cmd.exe /c echo ~
~

この機能を有効にすると、ネイティブ コマンドに渡される前に、PowerShell によってチルダが展開されます。

PS> cmd.exe /c echo ~
C:\Users\username

この機能は Windows にのみ適用されます。 Windows 以外のプラットフォームでは、チルダ展開はネイティブに処理されます。

この機能は、PowerShell 7.5-preview.2 で追加されました。