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 とどのように違うかを示すことです。 バージョン間の変更と新機能の追加の詳細については、各バージョンの新機能に関する記事を参照してください。
- PowerShell 7.5 の新機能
- PowerShell 7.4 の新機能
- PowerShell 7.3 の新機能
- PowerShell 7.2 の新機能
- PowerShell 7.1 の新機能
- PowerShell 7.0 の新機能
- PowerShell 6.x の新機能
.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-WinEvent
と New-WinEvent
を使用すると、Windows でイベントを取得および作成することができます。
Windows Presentation Framework (WPF) を使用するコマンドレット
.NET Core 3.1 で WPF のサポートが追加されたので、PowerShell 7.0 のリリースでは、次の Windows 固有の機能が復元されました。
Show-Command
コマンドレットOut-GridView
コマンドレットGet-Help
の ShowWindow パラメーター
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
と-PSConsoleFile
をpwsh.exe
から削除しました。 - 他のネイティブ ツールに合わせて
pwsh -version
とpwsh.exe
の組み込みヘルプを変更しました。 -File
と-Command
の無効な引数エラー メッセージと終了コードの Unix 標準への準拠- Windows の
-WindowStyle
パラメーターを追加しました。 同様に、Windows 以外のプラットフォームでのパッケージ ベースのインストール更新プログラムはインプレース アップデートとなります。
短い形式の名前も、Windows 以外のプラットフォーム上のシェルの名前形式と同じになるように設定されています。
ブール値のパラメーターを使用した PowerShell スクリプトの実行のサポート
以前は、-File
を使用する PowerShell スクリプトを実行する場合に pwsh.exe
を使用すると、$true
/$false
をパラメーター値として渡すことができませんでした。 解析された値としての $true
/$false
パラメーターのサポートが追加されました。 スイッチ値もサポートされています。
Windows PowerShell との下位互換性の向上
Windows の場合、新しいスイッチ パラメーター UseWindowsPowerShell が Import-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 要素チェックを省略します。
ParenExpression、SubExpression、ArrayExpression の $?
の保持
この 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
パラメーターで $DebugPreference
が Inquire ではなく 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
項目を操作およびフィルター処理できる ForEach
と Where
メソッドも含まれます。
$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
を自動的にインクルードします。 ただし、CompatiblePSEdition
が Core
と互換性有りとマークされている場合は、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 プロパティ名の入力ミスを修正
BiosSerialNumber
が BiosSeralNumber
と誤記されていましたが、正しいスペルに変更されました。
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-Csv
が PSTypeNames
を適用
以前は、ConvertFrom-Csv
を使用してインポートされた TypeInformation
を含む Export-CSV
を使用してオブジェクトをエクスポートすると、型情報が保持されませんでした。 今回の変更により、CSV ファイルから使用可能な場合は PSTypeNames
メンバーに型情報が追加されます。
-NoTypeInformation
が Export-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>
また、cd
と cd --
は $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-WebRequest
と Invoke-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
から ClrVersion
と BuildVersion
のプロパティを削除
$PSVersionTable
の ClrVersion
プロパティは、CoreCLR では役に立ちません。 エンド ユーザーは、互換性を判断するためにその値を使用すべきではありません。
BuildVersion
プロパティは、Windows のビルド バージョンに関連付けられており、Windows 以外のプラットフォームでは使用できません。 PowerShell の正確なビルド バージョンを取得するには、GitCommitId
プロパティを使用します。
Unicode エスケープ解析の実装
`u####
または `u{####}
は対応する Unicode 文字に変換されます。 `u
リテラルを出力するには、 ``u
のように、グラーブ文字をエスケープします。
PS 関数の ValueFromRemainingArguments
でのパラメーター バインドの問題
ValueFromRemainingArguments
は、それ自体が配列である単一の値ではなく、値を配列として返すよう変更されました。
CommandTypes.Workflow
および WorkflowInfoCleaned
の使用のクリーンアップ
System.Management.Automation の CommandTypes.Workflow
と WorkflowInfo
の使用に関連するコードをクリーン アップします。
これらの軽微な破壊的変更は、主にヘルプ プロバイダー コードに影響します。
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_OPTOUT
を true
、yes
、または 1
に設定します。 ファイル DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY
を削除することによるテレメトリの無効化はサポートされなくなっています。
PowerShell