Windows PowerShell 5.1 と PowerShell 7.x の相違点

Windows PowerShell 5.1 は、.NET Framework v4.5 の上に構築されます。 PowerShell 6.0 のリリースにより、PowerShell は .NET Core 2.0 上に構築されたオープン ソース プロジェクトになりました。 .NET Framework を .NET Core に移行することにより、PowerShell はクロスプラットフォーム ソリューションになりました。 PowerShell は、Windows、macOS、Linux で実行されます。

Windows PowerShell と PowerShell の間で、PowerShell 言語の違いはほとんどありません。 その違いは、Windows と Windows 以外のプラットフォームの間での PowerShell コマンドレットの可用性と動作、および .NET Framework と .NET Core の違いに起因する変更点に最も顕著に現れています。

この記事では、Windows PowerShell と Windows PowerShell の現在のバージョンの大きな違いと破壊的変更についてまとめています。 この概要には、新機能や追加されたコマンドレットは含まれません。 また、この記事では、バージョン間の変更点についても説明しません。 この記事の目的は、PowerShell の現在の状態と、それが Windows PowerShell とどのように違うかを示すことです。 バージョン間の変更と新機能の追加の詳細については、各バージョンの新機能に関する記事を参照してください。

.NET Framework と .NET Core

Linux と macOS での PowerShell は .NET Core を使用しています。これは、Microsoft Windows の完全な .NET Framework のサブセットです。 これは重要です。なぜなら、PowerShell では、ベースとなるフレームワークの型とメソッドに対する直接アクセスが提供されるためです。 このため、フレームワークの違いが原因で、Windows で動作するスクリプトが Windows 以外のプラットフォームでは動作しない場合があります。 .NET Core の変更点の詳細については、.NET Framework から .NET Core への移行に関する破壊的変更に関する記事を参照してください。

PowerShell の新しいリリースは、それぞれより新しいバージョンの .NET 上に構築されています。 .NET には、PowerShell に影響を与える破壊的変更がある場合があります。

  • PowerShell 7.5 - .NET 9.0 上に構築されています
  • PowerShell 7.4 - .NET 8.0 上に構築されています
  • PowerShell 7.3 - .NET 7.0 上に構築されています
  • PowerShell 7.2 (LTS-current) - .NET 6.0 (LTS-current) 上に構築されています
  • PowerShell 7.1 - .NET 5.0 上に構築されています
  • PowerShell 7.0 (LTS) - .NET Core 3.1 (LTS) 上に構築されています
  • PowerShell 6.2 - .NET Core 2.1 上に構築されています
  • PowerShell 6.1 - .NET Core 2.1 上に構築されています
  • PowerShell 6.0 - .NET Core 2.0 上に構築されています

.NET Standard 2.0 の登場により、従来の Windows PowerShell モジュールの多くを、変更なしで PowerShell に読み込むことができます。 さらに、PowerShell 7 には Windows PowerShell 互換性機能が含まれています。これにより、完全なフレームワークを必要とする Windows PowerShell モジュールを使用できます。

詳細については、次のトピックを参照してください。

.NET メソッドの変更に注意する

.NET メソッドの変更は PowerShell に固有のものではありませんが、特に .NET メソッドを直接呼び出す場合は、スクリプトに影響を与える可能性があります。 また、コンストラクターへの新たなオーバーロードが発生する可能性もあります。 これは、New-Object または [type]::new() メソッドを使用してオブジェクトを作成する方法に影響を与える可能性があります。

たとえば、.NET では、.NET Framework 4.5 では使用できない [System.String]::Split() メソッドにオーバーロードが追加されました。 次の一覧は、Windows PowerShell 5.1 で使用できる Split() メソッドのオーバーロードを示しています。

PS> "".Split

OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

次の一覧は、PowerShell 7 で使用できる Split() メソッドのオーバーロードを示しています。

"".Split

OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

Windows PowerShell 5.1 では、Split() メソッドに文字配列 (char[]) を string として渡すことができます。 このメソッドは、配列内の任意の文字でターゲット文字列を分割します。 次のコマンドは、Windows PowerShell 5.1 ではターゲット文字列を分割しますが、PowerShell 7 では分割しません。

# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333

正しいオーバーロードにバインドするには、文字列を文字配列に型キャストする必要があります。

# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333

PowerShell に付属しなくなったモジュール

互換性に関するさまざまな理由から、次のモジュールは PowerShell に含まれなくなりました。

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

PowerShell ワークフロー

PowerShell ワークフローは、実行時間の長い、または並列化されたタスクための堅牢な Runbook の作成を可能にする Windows Workflow Foundation (WF) の上に構築される Windows PowerShell の機能です。

.NET Core では Windows Workflow Foundation がサポートされていないため、PowerShell から PowerShell ワークフローが削除されました。

今後、PowerShell ワークフローを必要としない、PowerShell 言語でのネイティブの並列処理とコンカレンシーが可能になる予定です。

OS の再起動後にチェックポイントを使ってスクリプトを再開する必要がある場合は、タスク スケジューラを使って OS の起動時にスクリプトを実行することをお勧めします。ただし、そのスクリプトでそれ自体の状態を維持する必要があります (ファイルに保持するなど)。

PowerShell から削除されたコマンドレット

PowerShell に含まれているモジュールで、さまざまな互換性の理由やサポートされていない API の使用のために、次のコマンドレットが PowerShell から削除されました。

CimCmdlets

  • Export-BinaryMiLog

Microsoft.PowerShell.Core

  • Add-PSSnapin
  • Export-Console
  • Get-PSSnapin
  • Remove-PSSnapin
  • Resume-Job
  • Suspend-Job

Microsoft.PowerShell.Diagnostics

  • Export-Counter
  • Import-Counter

Microsoft.PowerShell.Management

  • Add-Computer
  • Checkpoint-Computer
  • Clear-EventLog
  • Complete-Transaction
  • Disable-ComputerRestore
  • Enable-ComputerRestore
  • Get-ComputerRestorePoint
  • Get-ControlPanelItem
  • Get-EventLog
  • Get-Transaction
  • Get-WmiObject
  • Invoke-WmiMethod
  • Limit-EventLog
  • New-EventLog
  • New-WebServiceProxy
  • Register-WmiEvent
  • Remove-Computer
  • Remove-EventLog
  • Remove-WmiObject
  • Reset-ComputerMachinePassword
  • Restore-Computer
  • Set-WmiInstance
  • Show-ControlPanelItem
  • Show-EventLog
  • Start-Transaction
  • Test-ComputerSecureChannel
  • Undo-Transaction
  • Use-Transaction
  • Write-EventLog

Microsoft.PowerShell.Utility

  • Convert-String
  • ConvertFrom-String

PSDesiredStateConfiguration

  • Disable-DscDebug
  • Enable-DscDebug
  • Get-DscConfiguration
  • Get-DscConfigurationStatus
  • Get-DscLocalConfigurationManager
  • Publish-DscConfiguration
  • Remove-DscConfigurationDocument
  • Restore-DscConfiguration
  • Set-DscLocalConfigurationManager
  • Start-DscConfiguration
  • Stop-DscConfiguration
  • Test-DscConfiguration
  • Update-DscConfiguration

WMI v1 コマンドレット

PowerShell から次の WMI v1 コマンドレットが削除されました。

  • Register-WmiEvent
  • Set-WmiInstance
  • Invoke-WmiMethod
  • Get-WmiObject
  • Remove-WmiObject

CimCmdlets モジュール (別名 WMI v2) コマンドレットにより、同じ関数が実行され、新しい機能と再設計された構文が提供されます。

New-WebServiceProxy コマンドレットが削除された

.NET Core では、SOAP プロトコルを使用するためのサービスを提供する Windows Communication Framework はサポートされていません。 このコマンドレットは、SOAP を必要とするため削除されました。

*-Transaction コマンドレットの削除

以下のコマンドレットの使用方法は非常に限られていました。 これらのサポートを中止することが決定されました。

  • Complete-Transaction
  • Get-Transaction
  • Start-Transaction
  • Undo-Transaction
  • Use-Transaction

*-EventLog コマンドレット

*-EventLog コマンドレットはサポートされていない API を使用しているため、PowerShell から削除されました。 Get-WinEventNew-WinEvent を使用すると、Windows でイベントを取得および作成することができます。

Windows Presentation Framework (WPF) を使用するコマンドレット

.NET Core 3.1 で WPF のサポートが追加されたので、PowerShell 7.0 のリリースでは、次の Windows 固有の機能が復元されました。

  • Show-Command コマンドレット
  • Out-GridView コマンドレット
  • Get-HelpShowWindow パラメーター

PowerShell Desired State Configuration (DSC) の変更

Invoke-DscResource が、PowerShell 7.0 の試験的な機能として復元されました。

PowerShell 7.2 以降では、PSDesiredStateConfiguration モジュールが PowerShell から削除され、PowerShell ギャラリーに発行されています。 詳細については、PowerShell チーム ブログのお知らせを参照してください。

PowerShell 実行可能ファイルの変更

powershell.exe から pwsh.exe への名称変更

PowerShell のバイナリ名が powershell(.exe) から pwsh(.exe) に変更されました。 この変更により、マシンで PowerShell を実行し、Windows PowerShell と PowerShell のサイド バイ サイドのインストールをサポートするための決定論的な方法がユーザーに提供されます。

powershell.exe から pwsh(.exe) への追加の変更点は次のとおりです。

  • 最初の位置指定パラメーターが -Command から -File に変更されました。 この変更により、Windows 以外のプラットフォームの PowerShell 以外のシェルから実行されている PowerShell スクリプトの #! (シバンともいいます) の使用方法が修正されます。 これは、-File を指定せずに pwsh foo.ps1 または pwsh fooScript のようなコマンドを実行できることも意味します。 ただし、この変更によって、pwsh.exe -Command Get-Command などのコマンドを実行しようとする場合は -c または -Command を明示的に指定する必要があります。
  • pwsh-i (または -Interactive) スイッチを受け入れ、対話型シェルを示します。 これにより、Unix プラットフォームで既定のシェルとして PowerShell を使用できるようになります。
  • パラメーターの -ImportSystemModules-PSConsoleFilepwsh.exe から削除しました。
  • 他のネイティブ ツールに合わせて pwsh -versionpwsh.exe の組み込みヘルプを変更しました。
  • -File-Command の無効な引数エラー メッセージと終了コードの Unix 標準への準拠
  • Windows の -WindowStyle パラメーターを追加しました。 同様に、Windows 以外のプラットフォームでのパッケージ ベースのインストール更新プログラムはインプレース アップデートとなります。

短い形式の名前も、Windows 以外のプラットフォーム上のシェルの名前形式と同じになるように設定されています。

ブール値のパラメーターを使用した PowerShell スクリプトの実行のサポート

以前は、-File を使用する PowerShell スクリプトを実行する場合に pwsh.exe を使用すると、$true/$false をパラメーター値として渡すことができませんでした。 解析された値としての $true/$false パラメーターのサポートが追加されました。 スイッチ値もサポートされています。

Windows PowerShell との下位互換性の向上

Windows の場合、新しいスイッチ パラメーター UseWindowsPowerShellImport-Module に追加されています。 このスイッチにより、PowerShell 7 にプロキシ モジュールが作成されます。このモジュールは、ローカルの Windows PowerShell プロセスを使用して、そのモジュールに含まれる任意のコマンドレットを暗黙的に実行します。 詳細については、「Import-Module」を参照してください。

PowerShell 7.0 で動作する Microsoft モジュールの詳細については、モジュールの互換性に関する表をご覧ください。

Windows での Microsoft Update のサポート

PowerShell 7.2 では、Microsoft Update のサポートが追加されました。 この機能を有効にすると、従来の Windows Update (WU) の管理フローで、PowerShell 7 の最新の更新プログラムが提供されます。これは、Windows Update for Business、WSUS、SCCM、または設定の対話型 WU ダイアログのいずれでも同じです。

PowerShell 7.2 の MSI パッケージには、次のコマンド ライン オプションが含まれています。

  • USE_MU - このプロパティには、次の 2 つの有効値があります。
    • 1 (既定値) - Microsoft Update または WSUS による更新にオプトインします
    • 0 - Microsoft Update または WSUS による更新にオプトインしません
  • ENABLE_MU
    • 1 (既定値) - Windows Update の使用にオプトインします (自動更新または Microsoft Update)
    • 0 - Windows Update の使用にオプトインしません (自動更新または Microsoft Update)

エンジンの変更

既定の Unix シェルとしての PowerShell のサポート

Unix では、対話型のシェルで -i の入力を受け付けることが通常で、多くのツールでこの動作が前提とされ、スイッチ -i を使ってシェルを呼び出します (たとえば script や、PowerShell が既定のシェルに設定されている場合)。 以前は -inputformat と一致する便利な方法として -i を使用できましたが、この重要な変更後は -in を使用する必要があります。

カスタム スナップイン

PowerShell スナップインは、PowerShell モジュールの前身ですが、PowerShell コミュニティではあまり使用されていません。

スナップインのサポートは複雑であり、コミュニティ内での普及率が低いことから、PowerShell でのカスタム スナップインのサポートを終了します。

試験機能フラグ

PowerShell 6.2 では試験的機能のサポートが有効になりました。 これにより、PowerShell の開発者は新しい機能を提供し、設計が完了する前にフィードバックを取得できます。 このようにすると、設計の進化に伴って破壊的変更が発生するのを回避できます。

使用できる試験的機能の一覧を取得するには、Get-ExperimentalFeature を使います。 これらの機能は、Enable-ExperimentalFeature および Disable-ExperimentalFeature で有効または無効にできます。

GAC から読み込む前に、モジュール ベース パスからアセンブリを読み込む

以前は、バイナリ モジュールの GAC にモジュール アセンブリがある場合、アセンブリをモジュール ベース パスから読み込む前に、GAC から読み込んでいました。

要素の型が値型のコレクションの null 要素チェックをスキップ

Mandatoryパラメーターと ValidateNotNull および ValidateNotNullOrEmpty 属性について、コレクションの要素の型が値型の場合に null 要素チェックを省略します。

ParenExpressionSubExpressionArrayExpression$? の保持

この PR によって、サブパイプライン (...)、部分式 $(...)、配列式 @() をコンパイルする方法が変更され、$? が自動的に true にならないようにします。 代わりに、$? の値は、実行されたパイプラインまたはステートメントの結果によって異なります。

ネイティブ コマンドによって stderr に書き込まれるときに、$?$false にならないように修正

ネイティブ コマンドによって stderr に書き込まれるときに、$?$false に設定されません。 ネイティブ コマンドは、一般的に、エラーを示すことなく stderr に書き込みます。 ネイティブ コマンドの終了コードがゼロ以外の場合、$?$false に設定されます。

$ErrorActionPreference がネイティブ コマンドの stderr 出力に影響を与えなくなった

ネイティブ コマンドは、一般的に、エラーを示すことなく stderr に書き込みます。 この変更があっても、stderr の出力は ErrorRecord オブジェクトで引き続きキャプチャされますが、ErrorRecord がネイティブ コマンドから取得された場合、ランタイムによって $ErrorActionPreference が適用されなくなります。

ASCII ではなく UTF-8 NoBOM エンコードを使用するよう $OutputEncoding を変更

以前のエンコード、ASCII (7 ビット) を使用すると、出力が不適切に変更される場合があります。 UTF-8 NoBOM が既定値となり、ほとんどのツールおよびオペレーティング システムでサポートされているエンコードを使用して Unicode 出力が保持されます。

コマンドレットと -Encoding パラメーターを System.Text.Encoding 型に統合

-Encoding の値 Byteはファイルシステム プロバイダーのコマンドレットから削除されました。 新しいパラメーター -AsByteStream を使用して、入力としてバイト ストリームが必要なこと、あるいは出力がバイト ストリームであることを指定してください。

Windows 以外のプラットフォームの New-ModuleManifest エンコードを UTF8NoBOM に変更

以前は、New-ModuleManifest は、BOM を使用して UTF-16 で psd1 マニフェストを作成しており、Linux ツールで問題が発生していました。 今回の重要な変更により、Windows 以外のプラットフォーム上の エンコーディング New-ModuleManifest が UTF (BOM なし) に変更されました。

大部分の既定の別名から AllScope を削除

スコープの作成を高速化するために、大部分の既定エイリアスから AllScope が削除されました。 検索が高速化できる使用頻度の高いいくつかのエイリアスでは AllScope のままになっています。

-Verbose および -Debug による $ErrorActionPreference のオーバーライドの終了

以前は、-Verbose または -Debug が指定された場合、それにより $ErrorActionPreference の動作がオーバーライドされていました。 今回の変更により、-Verbose および -Debug$ErrorActionPreference の動作に影響を与えることはなくなります。

さらに、-Debug パラメーターで $DebugPreferenceInquire ではなく Continue に設定されます。

$PSCulture がセッション内カルチャの変更を一貫して反映

Windows PowerShell では、現在のカルチャの値がキャッシュされるため、セッションの開始後にカルチャが変更されると値が同期しなくなる場合があります。 このキャッシュ動作が、PowerShell Core で修正されています。

明示的に指定された名前付きパラメーターで、ハッシュテーブル スプラッティングからの同じものを置き換えることが可能に

この変更により、スプラッティングからの名前付きパラメーターは、明示的に指定されたすべての名前付きパラメーターがバインドされた後にバインドされるように、パラメーター リストの末尾に移動されます。 単純な関数のパラメーター バインドでは、指定された名前付きパラメーターが見つからない場合のエラーはスローされません。 不明な名前付きパラメーターは、単純な関数の $args パラメーターにバインドされます。 スプラッティングを引数リストの末尾に移動すると、パラメーターが $args に表示される順序が変わります。

以下に例を示します。

function SimpleTest {
    param(
        $Name,
        $Path
    )
    "Name: $Name; Path: $Path; Args: $args"
}

以前の動作では、MyPath-Path にバインドされていません。これは、引数リストの 3 番目の引数であるためです。 ## そのため、Blah = "World" と共に '$args' に埋め込まれて終了します

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

言語の変更

null 合体演算子 ??

null 合体演算子 ?? は、左側のオペランドが null でない場合に、左側のオペランドの値を返します。 それ以外の場合は、右側のオペランドを評価し、その結果を返します。 左側のオペランドが null 以外に評価された場合、?? 演算子は右側のオペランドを評価しません。

$x = $null
$x ?? 100
100

次の例では、右側のオペランドは評価されません。

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

null 合体代入演算子 ??=

null 合体代入演算子 ??= は、左側のオペランドが null と評価された場合にのみ、右側のオペランドの値を左側のオペランドに代入します。 ??= 演算子では、左側のオペランドが null 値以外に評価された場合は、その右側のオペランドは評価されません。

$x = $null
$x ??= 100
$x
100

次の例では、右側のオペランドは評価されません。

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020

Null 条件演算子

注意

この機能は、PowerShell 7.1 で試験段階からメインストリームに移行しました。

null 条件演算子は、そのオペランドが null 以外に評価される場合にのみ、メンバー アクセス ?.、または要素アクセス ?[] 演算子をそのオペランドに適用します。それ以外の場合は、null を返します。

PowerShell では、変数名の一部として ? が許可されるため、これらの演算子を使用するには、変数名の正式な仕様が必要です。 したがって、変数名は、${a} や、? が変数名 ${a?} に含まれる場合のように、{} で囲む必要があります。

次の例では、PropName の値が返されます。

$a = @{ PropName = 100 }
${a}?.PropName
100

次の例では、メンバー名 PropName へのアクセスを試みずに、null が返されます。

$a = $null
${a}?.PropName

同様に、要素の値が返されます。

$a = 1..10
${a}?[0]
1

オペランドが null の場合、要素にはアクセスされず、null が返されます。

$a = $null
${a}?[0]

注意

変数名の構文 ${<name>}$() 部分式演算子と混同しないでください。 詳細については、「about_Variables」の変数名のセクションを参照してください。

ジョブ コントロールに & 演算子を追加

パイプラインの最後に & を配置すると、パイプラインが PowerShell ジョブとして実行されます。 パイプラインをバックグラウンドで実行すると、ジョブ オブジェクトが返されます。 パイプラインがジョブとして実行されている場合は、標準の *-Job コマンドレットをすべてジョブの管理のために使用できます。 パイプラインで使用される変数 (プロセス固有の変数は無視) は、Copy-Item $foo $bar & のみが機能するようにジョブに自動的にコピーされます。 また、ジョブは、ユーザーのホーム ディレクトリではなく、現在のディレクトリで実行されます。

PSCustomObject での新しいメソッド/プロパティ

PSCustomObject に新しいメソッドとプロパティが追加されました。 PSCustomObject には、他のオブジェクトと同じように Count/Length プロパティが含まれるようになっています。

$PSCustomObject = [pscustomobject]@{foo = 1}

$PSCustomObject.Length
1
$PSCustomObject.Count
1

この作業には、PSCustomObject 項目を操作およびフィルター処理できる ForEachWhere メソッドも含まれます。

$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
  1

PSMethod からデリゲートへの変換

PSMethod をデリゲートに変換することができます。 これにより、PSMethod[M]::DoubleStrLen をデリゲート値として [M]::AggregateString に渡すといった操作ができるようになります。

class M {
    static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }

    static [long] AggregateString([string[]] $values, [func[string, int]] $selector) {
        [long] $res = 0
        foreach($s in $values){
            $res += $selector.Invoke($s)
        }
        return $res
    }
}

[M]::AggregateString((gci).Name, [M]::DoubleStrLen)

PowerShell 7.1 での文字列比較動作の変更

PowerShell 7.1 は .NET 5.0 上に構築されており、次の破壊的変更が導入されています。

.NET 5.0 以降、カルチャ不変の文字列比較では、印字されない制御文字が無視されます。

たとえば、次の 2 つの文字列は同一と見なされます。

# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True

新しいコマンドレット

新しい Get-Uptime コマンドレット

Get-Uptime コマンドレットは、オペレーティング システムの最後のブートからの経過時間を返します。 このコマンドレットは、PowerShell 6.0 で導入されました。

新しい Remove-Alias コマンドレット

Remove-Alias コマンドレットは、現在の PowerShell セッションからエイリアスを削除します。 このコマンドレットは、PowerShell 6.0 で導入されました。

新しいコマンドレット Remove-Service

Remove-Service コマンドレットは、レジストリとサービス データベース内の Windows サービスを削除します。 Remove-Service コマンドレットは、PowerShell 6.0 で導入されました。

新しい Markdown コマンドレット

Markdown は、HTML にレンダリングできる基本的な書式設定で読むことができるプレーンテキスト ドキュメントを作成するための標準です。

PowerShell 6.1 では、次のコマンドレットが追加されました。

  • ConvertFrom-Markdown - 文字列またはファイルの内容を MarkdownInfo オブジェクトに変換します。
  • Get-MarkdownOption - コンソールで Markdown コンテンツをレンダリングするために現在使用されている色とスタイルを返します。
  • Get-MarkdownOption - コンソールで Markdown コンテンツをレンダリングするために使用される色とスタイルを設定します。
  • Show-Markdown - コンソールまたは HTML としてマークダウン コンテンツを表示します

新しいTest-Json コマンドレット

Test-Json コマンドレットは、文字列が有効な JavaScript Object Notation (JSON) ドキュメントであるかどうかをテストし、必要に応じて、指定されたスキーマに対してその JSON ドキュメントを検証できます。

このコマンドレットは、PowerShell 6.1 で導入されました

試験的機能をサポートする新しいコマンドレット

試験的機能をサポートするために、PowerShell 6.2 に次のコマンドレットが追加されました。

新しい Join-String コマンドレット

Join-String コマンドレットは、パイプラインのオブジェクトを 1 つの文字列に結合します。 このコマンドレットは、PowerShell 6.2 で追加されました。

新しい ConciseView ビューと Get-Error コマンドレット

PowerShell 7.0 には、対話型エラーとスクリプト エラーを見やすく表示する、エラー メッセージの表示が改善された新しい既定のビューの ConciseView があります。 ビューは、ユーザー設定変数 $ErrorView を使用してユーザーが選択できます。

ConciseView を使用すると、スクリプトのエラーまたはパーサー エラーでない場合、エラー メッセージは 1 行になります。

Get-Childitem -Path c:\NotReal
Get-ChildItem: Cannot find path 'C:\NotReal' because it does not exist

スクリプトの実行中にエラーが発生した場合、または解析エラーの場合は、PowerShell によって複数行のエラー メッセージが返されます。それには、エラー、ポインター、およびエラーの場所を示すエラー メッセージが含まれています。 ターミナルで ANSI カラー エスケープ シーケンス (VT100) がサポートされていない場合、色は表示されません。

PowerShell 7 の既定のビューは ConciseView です。 以前の既定のビューの NormalView は、ユーザー設定変数 $ErrorView を設定して選択できます。

$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView

注意

エラー メッセージのアクセント カラーの変更をサポートするために、新しいプロパティ ErrorAccentColor$Host.PrivateData に追加されています。

新しいコマンドレットである Get-Error では、必要に応じて完全修飾エラーの詳細を完全に表示できます。 既定では、このコマンドレットによって、最後に発生したエラーの詳細 (内部例外を含む) が表示されます。

Get-Error コマンドレットは、組み込み変数 $Error を使用して、パイプラインからの入力をサポートします。 Get-Error によって、パイプ処理されたすべてのエラーが表示されます。

$Error | Get-Error

Get-Error コマンドレットでは、最新のパラメーターがサポートされているため、現在のセッションから表示するエラーの数を指定できます。

Get-Error -Newest 3 # Displays the lst three errors that occurred in the session

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

コマンドレットの変更

ForEach-Object に追加された並列実行

PowerShell 7.0 以降、コレクション内の項目を反復する ForEach-Object コマンドレットに、新しい Parallel パラメーターを持つ組み込みの並列処理が追加されました。

既定では、並列スクリプト ブロックは、並列タスクを開始した呼び出し元の現在の作業ディレクトリを使用します。

この例は、ローカルの Windows マシンで、5 つのシステム ログから 50,000 個のログ エントリを取得しています。

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count

50000

Parallel パラメーターは、入力ログ名ごとに並列実行されるスクリプト ブロックを指定します。

新しい ThrottleLimit パラメーターによって、指定した時間に並列実行されるスクリプト ブロックの数が制限されます。 既定値は 5 です。

$_ 変数を使用して、スクリプト ブロックで現在の入力オブジェクトを表すします。 $using: スコープを使用して、変数参照を実行中のスクリプト ブロックに渡します。

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

Windows の互換性のある組み込みモジュールについて、system32 を確認する

Windows 10 1809 更新プログラムと Windows Server 2019 では、複数の組み込み PowerShell モジュールが更新され、PowerShell との互換性があるとしてマークされました。

PowerShell は起動すると、PSModulePath 環境変数の一部として $windir\System32 を自動的にインクルードします。 ただし、CompatiblePSEditionCore と互換性有りとマークされている場合は、Get-Module および Import-Module に対してのみモジュールを公開します。

-SkipEditionCheck スイッチ パラメーターを使用すると、すべてのモジュールを表示するように、この動作をオーバーライドできます。 また、テーブル出力に対して PSEdition プロパティが追加されました。

すべての -LiteralPath パラメーターに対する -lp エイリアス

-LiteralPath パラメーターがあるすべての組み込み PowerShell コマンドレットに対し、標準のパラメーター別名 -lp が作成されました。

a*b が実際に存在しない場合は、エラーを返すよう Get-Item -LiteralPath a*b を修正

以前は、ワイルドカードを渡された -LiteralPath-Path と同様に処理され、ワイルドカードを使ってファイルが検出されない場合は、何も返さず終了していました。 正しい動作として、ファイルが存在しない場合はエラーを返すには、-LiteralPath はリテラルである必要があります。 -Literal にワイルドカードを使用した場合、リテラルとして処理するよう変更されました。

作業ディレクトリを Start-Job の現在のディレクトリに設定

Start-Job コマンドレットでは、現在のディレクトリを新しいジョブの作業ディレクトリとして使用するようになりました。

*-Computer コマンドレットから -Protocol を削除

CoreFX の RPC リモート処理 (特に Windows 以外のプラットフォームで) の問題と、PowerShell で一貫性のあるリモート処理エクスペリエンスを保証するため、\*-Computer コマンドレットから -Protocol パラメーターが削除されました。 リモート処理では DCOM がサポートされなくなりました。 次のコマンドレットでは、WSMAN リモート処理のみをサポートします。

  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

*-Service コマンドレットから -ComputerName を削除

一貫性のある PSRP の使用を促進するために、*-Service コマンドレットから -ComputerName パラメーターが削除されました。

返された行に区切り記号が含まれないように Get-Content -Delimiter を修正

以前は、Get-Content -Delimiter を使用したときの出力に一貫性がなく、区切り記号を削除するために追加のデータ処理が必要になり不便でした。 今回の変更により、返される行の区切り記号が削除されます。

Format-Hex の変更点

-Raw パラメーターは "no-op" になりました (なにも動作はしません)。 今後、すべての出力は、その型のすべてのバイトを含む数値の真の表現で表示されます。 これは、この変更の前に -Raw パラメーターで実行されていたものです。

Get-ComputerInfo プロパティ名の入力ミスを修正

BiosSerialNumberBiosSeralNumber と誤記されていましたが、正しいスペルに変更されました。

Get-StringHash および Get-FileHash コマンドレットの追加

CoreFX でサポートされていないハッシュ アルゴリズムがありましたが、今回の変更により、使用できなくなりました。

  • MACTripleDES
  • RIPEMD160

$null を渡した場合、エラーではなくすべてのオブジェクトが返されるよう、Get-* コマンドレットに妥当性確認を追加

次のコマンドに $null を渡すと、エラーがスローされるよう変更されました。

  • Get-Credential -UserName
  • Get-Event -SourceIdentifier
  • Get-EventSubscriber -SourceIdentifier
  • Get-Help -Name
  • Get-PSBreakpoint -Script
  • Get-PSProvider -PSProvider
  • Get-PSSessionConfiguration -Name
  • Get-Runspace -Name
  • Get-RunspaceDebug -RunspaceName
  • Get-Service -Name
  • Get-TraceSource -Name
  • Get-Variable -Name

Import-Csv に W3C 拡張ログ ファイル形式のサポートを追加

以前は、Import-Csv コマンドレットを使用して、W3C 拡張ログ形式でログ ファイルを直接インポートできず、追加の操作が必要でした。 今回の変更により、W3C 拡張ログ形式がサポートされます。

インポート時に CSV に型情報が存在する場合、Import-CsvPSTypeNames を適用

以前は、ConvertFrom-Csv を使用してインポートされた TypeInformation を含む Export-CSV を使用してオブジェクトをエクスポートすると、型情報が保持されませんでした。 今回の変更により、CSV ファイルから使用可能な場合は PSTypeNames メンバーに型情報が追加されます。

-NoTypeInformationExport-Csv の既定値に

以前は、Export-CSV コマンドレットから、オブジェクトの型名を含む最初の行としてコメントが出力されていました。 ほとんどの CSV ツールでは認識されないので、この変更によって型情報が既定で除外されます。 この変更はカスタマー フィードバックに対応したものです。

以前の動作のままにするには、-IncludeTypeInformation を使用してください。

Remove-Item のレジストリ パスで * が使用可能に

以前は、ワイルドカードを渡された -LiteralPath-Path と同様に処理され、ワイルドカードを使ってファイルが検出されない場合は、何も返さず終了していました。 正しい動作として、ファイルが存在しない場合はエラーを返すには、-LiteralPath はリテラルである必要があります。 -Literal にワイルドカードを使用した場合、リテラルとして処理するよう変更されました。

Group-Object でのグループの並べ替え

パフォーマンス向上の一環として、Group-Object でグループの並び替えられた一覧が返されるようになりました。 順序に依存すべきではありませんが、最初のグループを必要としていた場合、この変更が破壊的になる可能性があります。 以前の動作に依存することの影響は低いため、このパフォーマンス向上には変更するだけの価値があると判断されました。

Measure-Object での標準偏差

Measure-Object の出力に StandardDeviation プロパティが含まれるようになりました。

Get-Process | Measure-Object -Property CPU -AllStats
Count             : 308
Average           : 31.3720576298701
Sum               : 9662.59375
Maximum           : 4416.046875
Minimum           :
StandardDeviation : 264.389544720926
Property          : CPU

Get-PfxCertificate -Password

Get-PfxCertificate に、SecureString を受け取る Password パラメーターが追加されました。 これにより、非対話的に使用できるようになります。

$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '

$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint

more 関数の削除

以前の PowerShell には、more.com をラップする more という名前の Windows 上の関数がありました。 この関数は削除されました。

また、help 関数が変更され、Windows では more.com を、Windows 以外のプラットフォームでは $env:PAGER で指定されたシステムの既定のページャーを使用するようになりました。

cd DriveName: では、そのドライブの現在の作業ディレクトリに戻るようになりました

以前は、Set-Location または cd を使用して PSDrive に戻ると、ユーザーはそのドライブの既定の場所に送られました。 ユーザーはそのセッションで最後に認識された現在の作業ディレクトリに送られるようになりました。

cd - は以前のディレクトリを返す

C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>

または Linux 上:

PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>

また、cdcd --$HOME に変更します。

非管理者としての Update-Help

要望が多かったので、Update-Help は管理者でなくても実行できるようになりました。 Update-Help は既定でユーザー スコープのフォルダーにヘルプを保存します。

Where-Object -Not

Where-Object-Not パラメーターが追加されたことで、パイプラインのオブジェクトを、存在しないプロパティまたは null/空のプロパティ値でフィルター処理できるようになりました。

たとえば、次のコマンドでは、依存サービスが定義されていないすべてのサービスが返されます。

Get-Service | Where-Object -Not DependentServices

Web のコマンドレットへの変更

Web コマンドレットの基となる .NET API が System.Net.Http.HttpClient に変更されました。 この変更は、多くのメリットを提供します。 ただし、この変更と、Internet Explorer での相互運用性がないことを理由として、Invoke-WebRequestInvoke-RestMethodに重要な変更が加えられました。

  • Invoke-WebRequest では、基本的な HTML 解析のみがサポートされます。 Invoke-WebRequest は常に BasicHtmlWebResponseObject オブジェクトを返します。 ParsedHtml および Forms プロパティが削除されました。
  • BasicHtmlWebResponseObject.Headers の値は String から String[] に変更されました。
  • BasicHtmlWebResponseObject.BaseResponse は、System.Net.Http.HttpResponseMessage オブジェクトに変更されました。
  • Web コマンドレットの例外の Response プロパティが、System.Net.Http.HttpResponseMessage オブジェクトに変更されました。
  • -Headers および -UserAgent パラメーターの既定設定が、Strict RFC ヘッダー解析に変更されました。 これは、-SkipHeaderValidation を使用して無効にできます。
  • file:// および ftp:// URI スキームのサポートは終了しました。
  • System.Net.ServicePointManager 設定は使用できなくなります。
  • 現在、macOS では、証明書を使用した認証は使用できません。
  • http:// URI 経由で -Credential を使用するとエラーになります。 https:// URI を使用するか、または -AllowUnencryptedAuthenticationパラメーターを指定してエラーを回避してください。
  • -MaximumRedirection では、指定された制限を超えようとすると、最後のリダイレクトの結果を返す代わりに、終了エラーが生成されるようになりました。
  • PowerShell 6.2 では、JSON 応答に対して規定値が UTF-8 エンコードになるように変更が加えられました。 JSON 応答に文字セットが指定されていない場合、既定のエンコードは RFC 8259 に従って UTF-8 にする必要があります。
  • application-json 応答に対する既定のエンコードを UTF-8 に設定
  • 標準に準拠していない Content-Type ヘッダーを許可するための -SkipHeaderValidation パラメーターを追加
  • 簡略化された multipart/form-data をサポートするための -Form パラメーターを追加
  • リレーション キーの、準拠している、大文字と小文字を区別しない処理
  • Web コマンドレット用の -Resume パラメーターを追加

データが返されない場合、Invoke-RestMethod により、有益な情報が返される

API が null のみを返す場合、Invoke-RestMethod は、これを $null ではなく、文字列 "null" としてシリアル化していました。 今回の変更により、有効なシングル値 JSON null がリテラル $null として正しくシリアル化されるよう、Invoke-RestMethod のロジックが修正されました。

暗号化されていない接続経由で -Credential が送信された場合に、Web コマンドレットが警告

HTTP を使用する場合、パスワードなどのコンテンツはクリア テキストとして送信されます。 今回の変更は、これを既定で許可しないようにするもので、資格情報が安全でない方法で渡されると、エラーを返します。 -AllowUnencryptedAuthentication スイッチを使用すると、この動作を無効にできます。

Web コマンドレットの -OutFile パラメーターが -LiteralPath のように機能するようになりました

PowerShell 7.1 以降では、Web コマンドレットの OutFile パラメーターは LiteralPath と同様に動作し、ワイルドカードは処理しません。

API の変更

AddTypeCommandBase クラスを削除

パフォーマンス向上のため、Add-Type から AddTypeCommandBase クラスが削除されました。 このクラスは、Add-Type コマンドレットでのみ使用されており、ユーザーに影響はありません。

Add-Type でサポートされる言語としての VisualBasic の削除

これまでは、Add-Type コマンドレットを使用して Visual Basic コードをコンパイルできました。 Visual Basic は Add-Type ではほとんど使用されませんでした。 この機能を削除して、PowerShell のサイズを小さくしました。

RunspaceConfiguration サポートを削除

以前は、API を使用してプログラムで PowerShell 実行空間を作成する場合、従来の RunspaceConfiguration か新しい InitialSessionState クラスを使用できました。 今回の変更により RunspaceConfiguration のサポートが終了し、InitialSessionState のみがサポートされます。

CommandInvocationIntrinsics.InvokeScript が引数を $args ではなく $input にバインド

引数内のパラメーターの位置が正しくないため、引数ではなく入力として渡されていました。

$PSVersionTable から ClrVersionBuildVersion のプロパティを削除

$PSVersionTableClrVersion プロパティは、CoreCLR では役に立ちません。 エンド ユーザーは、互換性を判断するためにその値を使用すべきではありません。

BuildVersion プロパティは、Windows のビルド バージョンに関連付けられており、Windows 以外のプラットフォームでは使用できません。 PowerShell の正確なビルド バージョンを取得するには、GitCommitId プロパティを使用します。

Unicode エスケープ解析の実装

`u#### または `u{####} は対応する Unicode 文字に変換されます。 `u リテラルを出力するには、 ``u のように、グラーブ文字をエスケープします。

PS 関数の ValueFromRemainingArguments でのパラメーター バインドの問題

ValueFromRemainingArguments は、それ自体が配列である単一の値ではなく、値を配列として返すよう変更されました。

CommandTypes.Workflow および WorkflowInfoCleaned の使用のクリーンアップ

System.Management.AutomationCommandTypes.WorkflowWorkflowInfo の使用に関連するコードをクリーン アップします。

これらの軽微な破壊的変更は、主にヘルプ プロバイダー コードに影響します。

  • WorkflowInfo のパブリック コンストラクターを内部に変更します。 ワークフローをサポートしなくなったため、ユーザーに Workflow インスタンスの作成も許可しなくなりました。
  • System.Management.Automation.DebugSource 型はワークフローのデバッグのみに使用されるため、削除します。
  • ワークフローのデバッグにのみ使用される抽象クラス Debugger から SetParent のオーバーロードを削除します。
  • 派生クラス RemotingJobDebugger から SetParent の同じオーバーロードを削除します。

ScriptBlock をデリゲートに変換するときに、PSObject の戻り値の結果が折り返されなくなった

ScriptBlock が C# コンテキストで使用されるデリゲート型に変換されるときに PSObject の結果を折り返すと、次のような望まない問題が生じます。

  • 値がデリゲートの戻り値の型に変換されると、基本的に PSObject の折り返しが解除されます。 そのため、PSObject は不要です。
  • デリゲートの戻り値の型が object の場合、PSObject で折り返され、C# コード内での操作が困難になります。

この変更後、返されるオブジェクトが基になるオブジェクトになります。

リモート処理のサポート

Unix プラットフォームで WinRM を使用する PowerShell リモート処理 (PSRP) を使用するには、NTLM/Negotiate または基本認証 (HTTPS 経由) が必要です。 macOS 上の PSRP は、HTTPS 経由の基本認証のみをサポートしています。 Kerberos ベースの認証は、Windows 以外のプラットフォームではサポートされていません。

また、PowerShell は、すべてのプラットフォーム (Windows、macOS、Linux) で、SSH 経由の PowerShell リモート処理 (PSRP) もサポートしています。 詳細については、PowerShell の SSH リモート処理に関する記事を参照してください。

コンテナー用の PowerShell Direct は最初に pwsh の使用を試みる

PowerShell と Hyper-V の機能である PowerShell Direct を使用すると、ネットワーク接続または他のリモート管理サービスがなくても、Hyper-V VM またはコンテナーに接続できます。

以前の PowerShell Direct では、コンテナー上の組み込み Windows PowerShell インスタンスを使用して接続していました。 現在の PowerShell Direct は、最初に、PATH 環境変数で使用可能な pwsh.exe を使用して接続を試みます。 pwsh.exe を使用できない場合、PowerShell Direct は powershell.exe を使用するようにフォールバックします。

Enable-PSRemoting はプレビュー バージョン用に別のリモート処理エンドポイントを作成するようになった

Enable-PSRemoting では、2 つのリモート処理セッション構成が作成されるようになりました。

  • PowerShell のメジャー バージョン用のセッション構成。 たとえば、「 PowerShell.6 」のように入力します。 このエンドポイントは、"システム全体" の PowerShell 6 セッション構成として、すべてのマイナー バージョン更新で利用できます。
  • 1 つのバージョンに固有のセッション構成。たとえば、PowerShell.6.1.0 などです。

この動作は、同じコンピューターに PowerShell 6 の複数のバージョンをインストールしてアクセスできるようにしたい場合に便利です。

さらに、Enable-PSRemoting コマンドレットを実行した後で、PowerShell のプレビュー バージョンが独自のリモート処理セッション構成を持つようになりました。

C:\WINDOWS\system32> Enable-PSRemoting

前に WinRM を設定していない場合、出力が異なる場合があります。

WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.

PowerShell 6 のプレビュー ビルドと安定したビルドおよび特定バージョンごとに、異なる PowerShell セッション構成を見ることができます。

Get-PSSessionConfiguration
Name          : PowerShell.6.2-preview.1
PSVersion     : 6.2
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : PowerShell.6-preview
PSVersion     : 6.2
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : powershell.6
PSVersion     : 6.1
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : powershell.6.1.0
PSVersion     : 6.1
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

SSH に対してサポートされる user@host:port 構文

SSH クライアントは、通常、user@host:port の形式で接続文字列をサポートします。 PowerShell リモート処理用のプロトコルとして SSH が追加されたことに伴い、この形式の接続文字列のサポートが追加されました。

Enter-PSSession -HostName fooUser@ssh.contoso.com:2222

テレメトリは環境変数でのみ無効にできる

PowerShell は、起動されると基本的なテレメトリ データを Microsoft に送信します。 データには、OS 名、OS バージョン、および PowerShell のバージョンが含まれます。 このデータにより、PowerShell が使用されている環境をより深く理解し、新機能と修正の優先順位を付けることができます。

このテレメトリを無効にするには、環境変数 POWERSHELL_TELEMETRY_OPTOUTtrueyes、または 1 に設定します。 ファイル DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY を削除することによるテレメトリの無効化はサポートされなくなっています。