次の方法で共有


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

.NET Framework と .NET Core

Linux および macOS 上の PowerShell では、Microsoft Windows 上の完全な .NET Framework のサブセットである .NET Core が使用されます。 これは、PowerShell が基になるフレームワークの型とメソッドに直接アクセスできるため、重要です。 その結果、Windows で実行されるスクリプトは、フレームワークの違いにより、Windows 以外のプラットフォームでは実行されない可能性があります。 .NET Core での変更の詳細については、「.NET Framework から .NET Core への移行に関する破壊的変更」を参照してください。

PowerShell の新しい各リリースは、新しいバージョンの .NET 上に構築されています。 PowerShell に影響を与える破壊的変更が .NET で発生する可能性があります。

  • PowerShell 7.6 - .NET 10.0 (LTS) 上に構築
  • PowerShell 7.5 - .NET 9.0 上に構築
  • PowerShell 7.4 - .NET 8.0 (LTS) 上に構築
  • PowerShell 7.3 - .NET 7.0 上に構築
  • PowerShell 7.2 - .NET 6.0 (LTS) 上に構築
  • PowerShell 7.1 - .NET 5.0 上に構築
  • PowerShell 7.0 - .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 が登場すると、PowerShell は、従来の多くの Windows 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 では、文字配列 (char[]) をSplit()として 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 ワークフローは、Windows PowerShellの機能であり、 Windows Workflow Foundation(WF )の上に構築された機能で、長時間実行または並列化されたタスクのための堅牢なランブックを作成できます。

.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 コマンドレット

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

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

CimCmdlets モジュール (WMI v2) コマンドレットは同じ機能を実行し、新機能と再設計された構文を提供します。

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

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

*-Transaction CMDLETは削除済み

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

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

*-EventLog コマンドレット

サポートされていない API を使用しているため、 *-EventLog コマンドレットは PowerShell から削除されています。 Get-WinEvent Windowsでイベントを取得・作成するための New-WinEvent が利用可能です。

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

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

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

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 のサイド バイ サイド インストールをサポートするための決定的な方法が提供されます。

pwsh(.exe)からのpowershell.exe追加変更点:

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

短縮名は、Windows 以外のプラットフォームでのシェルの名前付けとも一致します。

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

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

Windows PowerShellとの後方互換性の向上

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

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

Windows向けMicrosoft Updateサポート

PowerShell 7.2 では、Microsoft Update のサポートが追加されました。 この機能を有効にすると、Windows Update for Business、WSUS、SCCM、または設定内のインタラクティブなWUダイアログなど、従来のWindows Update(WU)管理フローで最新のPowerShell 7アップデートが入手できます。

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

  • USE_MU - このプロパティには、次の 2 つの有効値があります。
    • 1 (デフォルト) - Microsoft UpdateまたはWSUSによる更新にオプトする
    • 0 - Microsoft Update または WSUS を使用した更新を選択しない
  • ENABLE_MU
    • 1 (デフォルト) - Microsoft Update、自動更新、Windows Updateの使用にオプトする
    • 0 - Microsoft Update の自動更新または Windows Update の使用を選択しない

エンジンの変更

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

Unix では、シェルが対話型シェルの -i を受け入れる規則であり、多くのツールはこの動作 (script たとえば、PowerShell を既定のシェルとして設定する場合など) を想定し、 -i スイッチを使用してシェルを呼び出します。 この変更は、以前は短縮形として使われていた-i、今は-InputFormatが必要だったことを踏まえ-inです。

カスタム スナップイン

PowerShell スナップイン は、PowerShell コミュニティで広く導入されていない PowerShell モジュールの前身です。

スナップインのサポートが複雑になり、コミュニティでの使用が不足しているため、PowerShell ではカスタム スナップインはサポートされなくなりました。

試験段階の機能フラグ

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

Get-ExperimentalFeatureを使って利用可能な実験機能のリストを取得してください。 これらの機能は Enable-ExperimentalFeatureDisable-ExperimentalFeatureで有効・無効にできます。

GAC から読み込もうとする前にモジュールの基本パスからアセンブリを読み込む

以前は、バイナリ モジュールに GAC にモジュール アセンブリがある場合は、モジュールの基本パスから読み込もうとする前に、GAC からアセンブリを読み込みます。

値型の要素型を持つコレクションの null 要素チェックをスキップする

MandatoryパラメータおよびValidateNotNullおよびValidateNotNullOrEmpty属性については、コレクションの要素型が値型であればヌル要素のチェックを省略してください。

$?SubExpressionArrayExpressionを保持する

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

stderrにネイティブコマンドが書き込みを行う際に$?$falseにならないように修正しました。

$?は、ネイティブ コマンドが $false に書き込むときにstderrに設定されません。 ネイティブ コマンドでは、障害を示さずに stderr に書き込むのが一般的です。 $? は、ネイティブ コマンドに 0 以外の終了コードがある場合にのみ、 $false に設定されます。

ネイティブ コマンドの出力 stderr$ErrorActionPreference影響を与えないようにする

ネイティブ コマンドでは、障害を示さずに stderr に書き込むのが一般的です。 この変更により、出力stderrErrorRecordオブジェクトにはまだキャプチャされますが、$ErrorActionPreferenceがネイティブコマンドから来ている場合ランタイムは適用されません。

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

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

コマンドレットのパラメーター -EncodingSystem.Text.Encoding型にする

-EncodingByteは、FileSystem プロバイダー コマンドレットから削除されました。 新しいパラメータ -AsByteStreamが使われ、入力としてバイトストリームが必要か、出力がバイトのストリームであることを指定します。

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

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

ほとんどの既定のエイリアスから AllScope を削除する

スコープ作成を迅速化するため、 AllScope はほとんどのデフォルトエイリアスから削除されました。 AllScope 検索が速いいくつかの頻繁に使われる別名に残されていました。

-Verbose-Debug$ErrorActionPreference をオーバーライドしなくなりました

以前は -Verbose-Debug が指定されると、 $ErrorActionPreferenceの動作を上書きしていました。 この変更により、 -Verbose-Debug はもはや $ErrorActionPreferenceの行動に影響を与えなくなりました。

また、-Debugパラメーターは$DebugPreferenceContinueに設定し、Inquireではありません。

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

Windows PowerShell では、現在のカルチャ値がキャッシュされます。これにより、値がセッションの起動後に変更され、カルチャとの同期から外れる可能性があります。 このキャッシュ動作は、PowerShell コアで修正されています。

明示的に指定された名前付きパラメーターが、ハッシュテーブルスプラッティングの同じパラメーターよりも優先することを許可する。

この変更により、スプラッティングからの名前付きパラメーターはパラメーター リストの末尾に移動され、明示的に指定されたすべての名前付きパラメーターがバインドされた後にバインドされます。 指定した名前付きパラメーターが見つからない場合でも、単純な関数のパラメーターバインディングではエラーが発生しません。 未知の名前付きパラメータは単純関数の $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

言語の変更

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

ヌル条件演算子

この機能は、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

この作業には、ForEach項目を操作・フィルタリングするためのWhereおよびPSCustomObject手法も含まれています。

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

PSMethod から Delegate への変換

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 コンテンツのレンダリングに使用されている現在の色とスタイルを返します。
  • Set-MarkdownOption - コンソールでの 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: Can't find path 'C:\NotReal' because it doesn't 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

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

新しい Get-Errorcmdlet は、必要に応じて完全修飾エラーの完全な詳細ビューを提供します。 デフォルトでは、コマンドレットは最後に発生したエラーの詳細な詳細を含め、内部例外を表示します。

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 が起動すると、$windir\System32環境変数の一部としてPSModulePathが自動的に含まれます。 ただし、モジュールを Get-ModuleImport-Module に露出させるのは、 CompatiblePSEditionCoreと互換性がある場合にのみです。

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

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

-lp パラメーターを持つすべての組み込み PowerShell コマンドレットに対して、標準のパラメーター エイリアス -LiteralPathを作成しました。

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

以前はワイルドカードが与えられ-LiteralPath-Pathと同じように扱い、ファイルが見つからなければ静かに退出していました。 正しい動作は、 -LiteralPath が文字通りであるべきで、ファイルが存在しなければエラーが出るはずです。 変更とは、 -Literal で使われるワイルドカードを文字通り扱うことです。

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

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

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

-Protocol パラメーターは、次のコマンドレットから削除されました。

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

DCOM はリモート処理でサポートされなくなりました。 コマンドレットは WSMAN リモート処理のみをサポートします。

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

PSRPの一貫した使用を促進するために、-ComputerNamecmdletから*-Serviceパラメータが削除されました。 代わりに、 Invoke-Command を使用してリモート コンピューターでコマンドレットを実行します。

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

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

Format-Hex に対する変更

-Raw パラメーターは何も実行しません。 Format-Hex コマンドレットは、型のすべてのバイトを含む数値の真の表現を表示します。 これは、この変更の前に -Raw パラメーターが行ったことです。

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

BiosSerialNumber 誤って BiosSeralNumber と綴られ、正しい綴りに変更されています。

使用可能なハッシュ アルゴリズムの変更

次のハッシュ アルゴリズムが .NET から削除されました。

  • MACTripleDES
  • RIPEMD160

この変更は、 Get-FileHash コマンドレットに影響します。

$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

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

以前は、 Import-Csv コマンドレットを使用して W3C 拡張ログ形式でログ ファイルを直接インポートすることはできないため、追加のアクションが必要です。 この変更により、W3C 拡張ログ形式がサポートされます。

Import-Csv 型情報が CSV に存在する場合、インポート時に pstypenames 適用されます

以前は、Export-CsvTypeInformation を使用してエクスポートされたオブジェクトが、ConvertFrom-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には、Passwordを受け取る SecureString パラメーターが含まれます。 これにより、非対話形式で使用できます。

$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をラップする関数をWindowsに提供していましたmore.com。 その関数は削除されました。

また、 help 機能はWindowsでは more.com 、Windows以外のプラットフォームでは $Env:PAGER が指定したシステムのデフォルトページャーを使うようになりました。

cd DriveName: ユーザーはそのドライブ内の現在のワーキングディレクトリに戻されます

以前は、 Set-Locationcd を使って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

-Not パラメーターを Where-Object に追加することで、パイプライン内のオブジェクトをフィルターし、プロパティが存在しないか、またはプロパティ値が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 Cmdlet例外の Response プロパティは現在 System.Net.Http.HttpResponseMessage オブジェクトとなっています。
  • 厳密なRFCヘッダー解析が -Headers および -UserAgent パラメータのデフォルトとなっています。 これは -SkipHeaderValidationで回避可能です。
  • file:// ftp://URIスキームはもはやサポートされていません。
  • System.Net.ServicePointManager 設定はもはや尊重されません。
  • 現在、macOS で使用できる証明書ベースの認証はありません。
  • -Credential URI上でhttp://を使うとエラーが生じます。 誤りを抑制するために https:// URIを使用するか、 -AllowUnencryptedAuthentication パラメータを提供してください。
  • -MaximumRedirection リダイレクトの試みが指定された制限を超えると、最後のリダイレクトの結果を返す代わりに終了エラーが発生します。
  • PowerShell 6.2 では、JSON 応答の既定の UTF-8 エンコードに変更が加えられました。 JSON 応答に文字セットが指定されていない場合、既定のエンコードは RFC 8259 ごとに UTF-8 にする必要があります。
  • application-json応答の既定のエンコードが UTF-8 に設定されている
  • 標準に準拠していない-SkipHeaderValidationヘッダーを許可するパラメーターContent-Type追加しました
  • 簡略化された-Formのサポートをサポートするために、multipart/form-data パラメーターを追加しました
  • 準拠した方法で、関係キーの大文字と小文字を区別しない処理
  • Web コマンドレット -Resume パラメーターを追加しました

Invoke-RestMethod データが返されない場合に役立つ情報を返します

API がnullだけを返すとき、Invoke-RestMethodはこれを"null"の代わりに文字列$nullとしてシリアル化していました。 この変更により、有効な単一値のJSONをInvoke-RestMethodとして正しくシリアライズするロジnullック$null修正されました。

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

HTTP を使用すると、パスワードを含むコンテンツがクリア テキストとして送信されます。 この変更は、既定ではこれを許可せず、資格情報が安全でない状態で渡されている場合にエラーを返すことです。 ユーザーは -AllowUnencryptedAuthentication スイッチを使ってこれを回避できます。

Web コマンドレット -OutFile パラメーターを次のように動作させる -LiteralPath

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

API の変更

クラス AddTypeCommandBase 削除する

性能向上のため AddTypeCommandBase クラスは Add-Type から廃止されました。 このクラスは、 Add-Type コマンドレットでのみ使用され、ユーザーに影響を与えるべきではありません。

Add-Type 年で VisualBasic をサポート言語から削除しました

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

サポート RunspaceConfiguration 削除されました

以前は、API を使用してプログラムで PowerShell 実行空間を作成する場合は、レガシ RunspaceConfiguration 以降の InitialSessionState クラスを使用できました。 この変更により RunspaceConfiguration のサポートは削除され、 InitialSessionStateのみ対応しています。

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

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

プロパティClrVersionおよびBuildVersionを削除する$PSVersionTable

ClrVersion$PSVersionTable プロパティは、CoreCLR では役に立ちません。 エンド ユーザーは、互換性を判断するためにその値を使用しないでください。

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

Unicode エスケープ解析を実装する

`u#### または、 `u{####} は対応するUnicode文字に変換されます。 リテラル `uを出力するには、バックティック: ``uをエスケープします。

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

ValueFromRemainingArguments これにより、単一の値ではなく配列として値を返します。

CommandTypes.Workflowの活用法の整理WorkflowInfoCleaned

CommandTypes.Workflow でのWorkflowInfoの使用に関連するコードをクリーンアップします。

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

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

PSObjectをデリゲートに変換するときにScriptBlockで戻り値の結果をラップしない

ScriptBlockがC#コンテキストで使用されるデリゲート型に変換されると、結果をラッピングPSObjectすると不要なトラブルが生じます:

  • 値が代理リターン型に変換されると、 PSObject は実質的にアンラップされます。 だから PSObject は不要です。
  • デリゲートリターン型が objectされると、 PSObject でラップされてしまい、C#コードでの扱いが難しくなります。

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

リモートサポート

Windows 以外のプラットフォームでは、WinRM を使用した PowerShell リモート処理 (PSRP) はサポートされていません。 Windows から WinRM 経由で PowerShell リモート処理 (PSRP) を使用して、他の Windows マシンに接続できます。 PowerShell では、すべてのプラットフォーム (Windows、macOS、Linux) での SSH 経由のリモート処理もサポートされています。 詳細については、 PowerShell での SSH リモート処理に関する説明を参照してください。

PowerShell Direct for Containers が最初に pwsh 使用を試みる

PowerShell Direct は、PowerShellおよび Hyper-V の機能で、ネットワーク接続やリモート管理サービスなしで Hyper-V VMやコンテナに接続できるようにします。

以前は、コンテナー上の組み込みの Windows PowerShell インスタンスを使用して PowerShell Direct が接続されました。 PowerShell Directはまず、pwsh.exe環境変数上の利用可能な任意のPATHを使って接続を試みます。 pwsh.exeが利用できない場合は、PowerShell Directがpowershell.exeを使うためにフォールバックします。

Enable-PSRemoting 現在はプレビューバージョンごとに別々のリモートエンドポイントを作成します

Enable-PSRemoting 次に、2つのリモートセッション構成を作成します。

  • PowerShell のメジャー バージョン用の 1 つ。 たとえば、「 PowerShell.6 」のように入力します。 "システム全体" の PowerShell 6 セッション構成として、マイナー バージョンの更新プログラム全体に依存できるこのエンドポイント
  • 例えば、バージョン固有のセッション構成があります: PowerShell.6.1.0

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

さらに、PowerShellのプレビュー版は Enable-PSRemoting コマンドレットを実行する後に独自のリモートセッション構成を得られるようになりました。

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

user@host:port SSH対応構文

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 はもうサポートしていません。