PowerShell Core 6.0 は、クロスプラットフォーム (Windows、macOS、Linux)、オープンソース、異種環境とハイブリッド クラウド用に構築された PowerShell の新しいエディションです。
.NET Framework から .NET Core に移行しました
PowerShell Core では、.NET Core 2.0 をランタイムとして使用します。 .NET Core 2.0 を使用すると、PowerShell Core を複数のプラットフォーム (Windows、macOS、Linux) で動作できます。 PowerShell Core では、.NET Core 2.0 によって提供される API セットも公開され、PowerShell コマンドレットとスクリプトで使用されます。
Windows PowerShell は、.NET Framework ランタイムを使用して PowerShell エンジンをホストしました。 つまり、Windows PowerShell では、.NET Framework によって提供される API セットが公開されます。
.NET Core と .NET Framework の間で共有される API は、.NET Standard
PowerShell Core と Windows PowerShell の間のモジュール/スクリプトの互換性にどのように影響するかの詳細については、「Windows PowerShellとの下位互換性」を参照してください。
macOS と Linux のサポート
PowerShell では、以下を含む macOS と Linux が正式にサポートされるようになりました。
- Windows 7、8.1、10
- Windows Server 2008 R2、2012 R2、2016
- Windows Server Semi-Annual チャネル の
- Ubuntu 14.04、16.04、17.04
- Debian 8.7 以降、および 9
- CentOS 7
- Red Hat Enterprise Linux 7
- OpenSUSE 42.2
- Fedora 25、26
- macOS 10.12 以降
コミュニティでは、次のプラットフォーム用のパッケージも提供していますが、公式にはサポートされていません。
- Arch Linux
- Kali Linux
- AppImage (複数の Linux プラットフォームで動作)
また、次のプラットフォーム向けの試験的な (サポートされていない) リリースもあります。
- ARM32/ARM64 上の Windows
- Raspbian (Stretch)
PowerShell Core 6.0 では、Windows 以外のシステムでより適切に動作するように、いくつかの変更が行われました。 これらの一部は破壊的変更であり、Windows にも影響します。 その他は、PowerShell Core の Windows 以外のインストールにのみ存在するか、該当します。
- Unix プラットフォームでのネイティブ コマンド グロービングのサポートを追加しました。
-
more
機能は Linux$PAGER
に対応し、既定ではless
です。 つまり、ネイティブ バイナリ/コマンド (ls *.txt
など) でワイルドカードを使用できるようになりました。 (#3463) - ネイティブ コマンド引数を処理すると、末尾の円記号は自動的にエスケープされます。 (#4965)
- スクリプト署名は現在サポートされていないため、Windows 以外のプラットフォームで PowerShell を実行する場合は、
-ExecutionPolicy
スイッチを無視します。 (#3481) - Unix プラットフォーム上の
NoEcho
を優先するように ConsoleHost を修正しました。 (#3801) - Unix プラットフォームで大文字と小文字を区別しないパターン マッチングをサポートする
Get-Help
を修正しました。 (#3852) - パッケージ
powershell
追加された man-page
伐採
macOS では、PowerShell はネイティブ os_log
API を使用して、Apple の 統合ログ システムにログを記録します。 Linux では、PowerShell Syslog(ユビキタス ログ ソリューション) が使用されます。
ファイルシステム
MacOS と Linux では、Windows で従来サポートされていないファイル名文字をサポートするために、いくつかの変更が行われています。
- コマンドレットに指定されたパスがスラッシュに依存しなくなっています (/と \ の両方がディレクトリ区切り記号として機能します)
- XDG ベース ディレクトリの仕様が尊重され、既定で使用されるようになりました。
- Linux/macOS プロファイル パスは、
~/.config/powershell/profile.ps1
にあります - 履歴の保存パスは、
~/.local/share/powershell/PSReadline/ConsoleHost_history.txt
にあります - ユーザー モジュールのパスは、
~/.local/share/powershell/Modules
にあります。
- Linux/macOS プロファイル パスは、
- Unix でのコロン文字を含むファイル名とフォルダー名のサポート。 (#4959)
- コンマを持つスクリプト名または完全なパスのサポート。 (#4136)(@TimCurwickのおかげで!
- ナビゲーション コマンドレットのワイルドカード展開を抑制するために
-LiteralPath
が使用されるタイミングを検出します。 (#5038) - *nix
ls -R
や WindowsDIR /S
ネイティブ コマンドのように動作するように、Get-ChildItem
を更新しました。Get-ChildItem
再帰検索中に検出されたシンボリック リンクが返され、それらのリンクがターゲットとするディレクトリは検索されません。 (#3780)
大文字と小文字の区別
Linux と macOS では大文字と小文字が区別される傾向があり、Windows では大文字と小文字が区別されず、大文字と小文字が区別されます。 一般に、PowerShell では大文字と小文字が区別されません。
たとえば、環境変数は macOS と Linux では大文字と小文字が区別されるため、PSModulePath
環境変数の大文字と小文字は標準化されています。 (#3255) Import-Module
は、モジュールの名前を特定するためにファイル パスを使用している場合、大文字と小文字が区別されません。 (#5097)
サイド バイ サイド インストールのサポート
PowerShell Core は、Windows PowerShell とは別にインストール、構成、実行されます。 PowerShell Core には、"ポータブル" ZIP パッケージがあります。 ZIP パッケージを使用すると、PowerShell を依存関係として受け取るアプリケーションにローカルを含め、任意の数のバージョンをディスク上の任意の場所にインストールできます。 サイド バイ サイド インストールを使用すると、PowerShell の新しいバージョンを簡単にテストし、時間の経過と同時に既存のスクリプトを移行できます。 また、スクリプトを必要な特定のバージョンにピン留めできるため、サイド バイ サイドで下位互換性を実現することもできます。
手記
既定では、Windows 上の MSI ベースのインストーラーはインプレース更新プログラムのインストールを行います。
powershell(.exe)
の名前を pwsh(.exe)
に変更しました
PowerShell Core のバイナリ名が powershell(.exe)
から pwsh(.exe)
に変更されました。 この変更により、ユーザーはコンピューター上で PowerShell Core を実行して、サイド バイ サイドの Windows PowerShell と PowerShell Core のインストールをサポートするための決定的な方法が提供されます。
pwsh
もはるかに短く、簡単に入力できます。
powershell.exe
からの pwsh(.exe)
に対する追加の変更:
- 最初の位置指定パラメーターを
-Command
から-File
に変更しました。 この変更により、Windows 以外のプラットフォーム上の PowerShell 以外のシェルから実行される PowerShell スクリプトでの#!
(別名 shebang) の使用が修正されます。 また、-File
を指定せずに、pwsh foo.ps1
やpwsh fooScript
などのコマンドを実行することもできます。 ただし、この変更を行うには、pwsh.exe -Command Get-Command
などのコマンドを実行するときに、-c
または-Command
を明示的に指定する必要があります。 (#4019) - PowerShell Core は、対話型シェルを示す
-i
(または-Interactive
) スイッチを受け入れます。 (#3558)これにより、PowerShell を Unix プラットフォームの既定のシェルとして使用できます。 -
pwsh.exe
からパラメーターの-importsystemmodules
と-psconsoleFile
を削除しました。 (#4995) - 他のネイティブ ツールに合わせて
pwsh.exe
のpwsh -version
と組み込みのヘルプを変更しました。 (#4958 & #4931)(@iSazonovに感謝) - Unix 標準と一致する
-File
および-Command
および終了コードの引数エラー メッセージが無効です (#4573) - Windows
-WindowStyle
パラメーターを追加しました。 (#4573)同様に、Windows 以外のプラットフォームでのパッケージ ベースのインストール更新プログラムは、インプレース更新プログラムです。
Windows PowerShell との下位互換性
PowerShell Core の目標は、Windows PowerShell との互換性を可能な限り維持することです。 PowerShell Core .NET Standard 2.0 を使用して、既存の .NET アセンブリとのバイナリ互換性を提供します。 多くの PowerShell モジュールは、これらのアセンブリ (多くの場合、DLL) に依存しているため、.NET Standard を使用すると、.NET Core を引き続き使用できます。 PowerShell Core には、.NET Framework DLL の依存関係を見つけるために、グローバル アセンブリ キャッシュが通常ディスク上に存在するよく知られているフォルダーを調べるヒューリスティックも含まれています。
.NET Standard の詳細については、.NET ブログ、この YouTube ビデオ、および GitHub のこの FAQ を参照してください。
PowerShell 言語と "組み込み" モジュール (Microsoft.PowerShell.Management
、Microsoft.PowerShell.Utility
など) が Windows PowerShell と同じように動作するように、ベスト エフォートが行われています。 多くの場合、コミュニティの助けを借りて、これらのコマンドレットに新しい機能とバグ修正を追加しました。 場合によっては、基になる .NET レイヤーに依存関係がないため、機能が削除されたか、使用できません。
Windows の一部として出荷されるモジュール (たとえば、
WindowsPSModulePath
モジュールをインストールすると、Windows PowerShell PSModulePath
を PowerShell Core PSModulePath
に追加することで、Windows PowerShell モジュールを使用できます。
まず、PowerShell ギャラリーから WindowsPSModulePath
モジュールをインストールします。
# Add `-Scope CurrentUser` if you're installing as non-admin
Install-Module WindowsPSModulePath -Force
このモジュールをインストールした後、Add-WindowsPSModulePath
コマンドレットを実行して、Windows PowerShell PSModulePath
を PowerShell Core に追加します。
# Add this line to your profile if you always want Windows PowerShell PSModulePath
Add-WindowsPSModulePath
Docker のサポート
PowerShell Core では、サポートするすべての主要プラットフォーム (複数の Linux ディストリビューション、Windows Server Core、Nano Server を含む) の Docker コンテナーのサポートが追加されます。
完全な一覧については、Docker Hubの
SSH ベースの PowerShell リモート処理
PowerShell リモート処理プロトコル (PSRP) は、従来の WinRM ベースの PSRP に加えて、Secure Shell (SSH) プロトコルでも動作するようになりました。
つまり、Enter-PSSession
や New-PSSession
などのコマンドレットを使用し、SSH を使用して認証できます。 必要なのは、PowerShell を OpenSSH ベースの SSH サーバーにサブシステムとして登録することであり、従来の PSSession
セマンティクスで既存の SSH ベースの認証メカニズム (パスワードや秘密キーなど) を使用できます。
SSH ベースのリモート処理の構成と使用の詳細については、SSHを介した PowerShell リモート処理の
New-ModuleManifest を除き、既定のエンコードは BOM なしの UTF-8 です
以前は、Get-Content
などの Windows PowerShell コマンドレット Set-Content
、ASCII や UTF-16 などのさまざまなエンコードを使用してきました。 エンコードの違いにより、エンコードを指定せずにコマンドレットを混在させると、既定で問題が発生します。
Windows 以外のプラットフォームでは、従来、テキスト ファイルの既定のエンコードとしてバイトオーダー マーク (BOM) のない UTF-8 が使用されています。 より多くの Windows アプリケーションとツールが UTF-16 から、BOM レス UTF-8 エンコードに移行しています。 PowerShell Core は、より広範なエコシステムに準拠するように既定のエンコードを変更します。
つまり、-Encoding
パラメーターを使用するすべての組み込みコマンドレットでは、既定で UTF8NoBOM
値が使用されます。 この変更の影響を受けるコマンドレットを次に示します。
- Add-Content
- Export-Clixml
- Export-Csv
- Export-PSSession
- Format-Hex
- Get-Content
- Import-Csv
- Out-File
- Select-String
- Send-MailMessage
- Set-Content
これらのコマンドレットも更新され、-Encoding
パラメーターが System.Text.Encoding
を汎用的に受け入れるようにしています。
$OutputEncoding
の既定値も UTF-8 に変更されました。
ベスト プラクティスとして、プラットフォーム間で決定論的な動作を生成するには、-Encoding
パラメーターを使用してスクリプトでエンコードを明示的に設定する必要があります。
New-ModuleManifest
コマンドレットには Encoding パラメーターがありません。
New-ModuleManifest
コマンドレットで作成されたモジュール マニフェスト (.psd1) ファイルのエンコードは、環境によって異なります。Linux で実行されている PowerShell Core の場合、エンコードは UTF-8 (BOM なし) です。それ以外の場合、エンコードは UTF-16 (BOM あり) です。 (#3940)
アンパサンド (&
) を使用したパイプラインのバックグラウンド処理のサポート (#3360)
パイプラインの最後に &
を配置すると、パイプラインが PowerShell ジョブとして実行されます。 パイプラインがバックグラウンドで実行されると、ジョブ オブジェクトが返されます。 パイプラインがジョブとして実行されると、すべての標準 *-Job
コマンドレットを使用してジョブを管理できます。 パイプラインで使用される変数 (プロセス固有の変数を無視) はジョブに自動的にコピーされるため、Copy-Item $foo $bar &
は機能します。 ジョブは、ユーザーのホーム ディレクトリではなく、現在のディレクトリでも実行されます。 PowerShell ジョブの詳細については、「about_Jobs」を参照してください。
セマンティック バージョン管理
-
SemVer 2.0
と互換性SemanticVersion
作られています. (#5037)(@iSazonovありがとう! -
New-ModuleManifest
の既定のModuleVersion
を SemVer に合わせて0.0.1
に変更しました。 (#4842)(@LDSpitsに感謝) -
System.Management.Automation.SemanticVersion
の型アクセラレータとしてsemver
を追加しました。 (#4142)(@oisingのおかげで! -
SemanticVersion
インスタンスと、Major
とMinor
バージョンの値でのみ構築されるVersion
インスタンスの比較を有効にしました。
言語の更新
- ユーザーが Unicode 文字を引数、文字列、または変数名として使用できるように、Unicode エスケープ解析を実装します。 (#3958)(@rkeithhillのおかげで!
- ESC:
`e
の新しいエスケープ文字を追加しました - 列挙型を文字列に変換するためのサポートを追加しました (#4318) (@KirkMunroに感謝)
- ジェネリック コレクションへの単一要素配列のキャストを修正しました。 (#3170)
-
..
演算子に文字範囲オーバーロードを追加したので、'a'..'z'
は 'a' から 'z' の文字を返します。 (#5026)(@IISResetMeありがとう! - 読み取り専用変数を上書きしないように変数の割り当てを修正しました
- スクリプト コマンドレットをドット処理するときに、自動変数のローカルを 'DottedScopes' にプッシュする (#4709)
- 分割演算子で "Singleline, Multiline" オプションの使用を有効にする (#4721) (@iSazonovに感謝)
エンジンの更新
-
$PSVersionTable
には、次の 4 つの新しいプロパティがあります。-
PSEdition
: これは PowerShell Core でCore
に設定され、Windows PowerShell ではDesktop
に設定されます -
GitCommitId
: これは、PowerShell がビルドされた Git ブランチまたはタグの Git コミット ID です。 リリースされたビルドでは、おそらくPSVersion
と同じになります。 -
OS
: これは、[System.Runtime.InteropServices.RuntimeInformation]::OSDescription
によって返される OS バージョンの文字列です -
Platform
: これは、[System.Environment]::OSVersion.Platform
Windows、macOS でUnix
、Linux でUnix
にWin32NT
に設定することによって返されます。
-
-
$PSVersionTable
からBuildVersion
プロパティを削除しました。 このプロパティは、Windows ビルド バージョンに強く関連付けされていました。 代わりに、GitCommitId
を使用して PowerShell Core の正確なビルド バージョンを取得することをお勧めします。 (#3877)(@iSazonovのおかげで! -
$PSVersionTable
からプロパティClrVersion
削除します。 このプロパティは .NET Core には関係ありません。.NET Core では、PowerShell に適用できない特定のレガシ目的でのみ保持されていました。 - PowerShell が特定の OS で実行されているかどうかを判断するための 3 つの新しい自動変数 (
$IsWindows
、$IsMacOs
、$IsLinux
) を追加しました。 - PowerShell Core バナーに
GitCommitId
を追加します。 PowerShell を起動してバージョンを取得するとすぐに、$PSVersionTable
を実行する必要はありません。 (#3916)(@iSazonovのおかげで! -
$PSHome
にpowershell.config.json
という名前の JSON 構成ファイルを追加して、起動前に必要な設定 (ExecutionPolicy
など) を格納します。 - Windows EXE の実行時にパイプラインをブロックしない
- COM コレクションの列挙を有効にしました。 (#4553)
コマンドレットの更新
新しいコマンドレット
-
Microsoft.PowerShell.Utility
にGet-Uptime
を追加します。 - コマンド
Remove-Alias
追加します。 (#5143)(@PowershellNinjaありがとう! - 管理モジュールに
Remove-Service
を追加します。 (#4858)(@joandrsnありがとう!
Web コマンドレット
- Web コマンドレットの証明書認証のサポートを追加します。 (#4646)(@markekrausに感謝)
- Web コマンドレットにコンテンツ ヘッダーのサポートを追加します。 (#4494 & #4640)(@markekrausに感謝)
- Web コマンドレットに複数のリンク ヘッダーのサポートを追加します。 (#5265)(@markekrausありがとう!
- Web コマンドレットでのリンク ヘッダーの改ページ位置のサポート (#3828)
-
Invoke-WebRequest
の場合、応答に Link ヘッダーが含まれている場合は、URL とrel
属性を表す Dictionary として RelationLink プロパティを作成し、開発者が使用しやすくするために URL が絶対であることを確認します。 -
Invoke-RestMethod
の場合、応答に Link ヘッダーが含まれている場合、-FollowRelLink
スイッチを公開して、リンクが存在しなくなったか、オプションの-MaximumFollowRelLink
パラメーター値に達するまで、next
rel
リンクを自動的にフォローします。
-
-
-CustomMethod
パラメーターを Web コマンドレットに追加して、標準以外のメソッド動詞を使用できるようにします。 (#3142)(@Lee303!) のおかげで - Web コマンドレット
SslProtocol
サポートを追加します。 (#5329)(@markekrausありがとう! - Web コマンドレットに Multipart サポートを追加します。 (#4782)(@markekrausに感謝)
- システム全体のプロキシ設定を無視するように、web コマンドレットに
-NoProxy
を追加します。 (#3447)(@TheFlyingCorpseのおかげで! - Web コマンドレットのユーザー エージェントが OS プラットフォームを報告するようになりました (#4937) (@LDSpitsに感謝)
- ヘッダー値を検証せずにヘッダーを追加できるように、
-SkipHeaderValidation
スイッチを Web コマンドレットに追加します。 (#4085) - 必要に応じて、Web コマンドレットでサーバーの HTTPS 証明書を検証しないようにします。
- Web コマンドレットに認証パラメーターを追加します。 (#5052)(@markekrausに感謝)
- Basic、OAuth、Bearer の 3 つのオプションを提供する
-Authentication
を追加します。 -
-Token
を追加して、OAuth オプションと Bearer オプションのベアラー トークンを取得します。 - HTTPS 以外のトランスポート スキームに対して提供される認証をバイパスする
-AllowUnencryptedAuthentication
を追加します。
- Basic、OAuth、Bearer の 3 つのオプションを提供する
-
-ResponseHeadersVariable
をInvoke-RestMethod
に追加して、応答ヘッダーのキャプチャを有効にします。 (#4888)(@markekrausに感謝) - 応答状態コードが成功しなかった場合に、例外に HTTP 応答を含める Web コマンドレットを修正します。 (#3201)
- Web コマンドレットの
UserAgent
をWindowsPowerShell
からPowerShell
に変更します。 (#4914)(@markekrausに感謝) - 明示的な
ContentType
検出をInvoke-RestMethod
に追加する (#4692) - Web コマンドレット
-SkipHeaderValidation
が標準以外の User-Agent ヘッダーで動作するように修正しました。 (#4479 & #4512)(@markekrausに感謝)
JSON コマンドレット
- 代わりに
Hashtable
を返すConvertFrom-Json
に-AsHashtable
を追加します。 (#5043)(@bergmeisterありがとう! -
ConvertTo-Json
出力で、より美しいフォーマッタを使用します。 (#2787)(@kittholland!) のおかげで -
ConvertTo-Json
Jobject
シリアル化のサポートを追加します。 (#5141) - 完全な JSON 文字列を構築するパイプラインから文字列の配列を逆シリアル化する
ConvertFrom-Json
を修正しました。 これにより、改行によって JSON 解析が中断される場合が修正されます。 (#3823) -
System.Array
に定義されているAliasProperty "Count"
を削除します。 これにより、一部のConvertFrom-Json
出力の余分なCount
プロパティが削除されます。 (#3231)(@PetSerAlのおかげで!
CSV コマンドレット
-
Import-Csv
で W3C 拡張ログ ファイル形式 (#2482) がサポートされるようになりました (@iSazonovに感謝) -
Import-Csv
とConvertFrom-Csv
PSTypeName
サポートを追加します。 (#5389)(@markekrausありがとう! - 行区切り記号
Import-Csv
CR
、LF
、およびCRLF
をサポートするようにします。 (#5363)(@iSazonovありがとう! -
Export-Csv
とConvertTo-Csv
の既定値-NoTypeInformation
します。 (#5164)(@markekrausありがとう!
サービス コマンドレット
- プロパティ
UserName
、Description
、DelayedAutoStart
、BinaryPathName
、およびStartupType
を、Get-Service
によって返されるServiceController
オブジェクトに追加します。 (#4907)(@joandrsnに感謝) - コマンドで資格情報を設定する機能
Set-Service
追加します。 (#4844)(@joandrsnに感謝)
その他のコマンドレット
- 必要に応じてシンボリック リンクを走査する
-FollowSymlink
と呼ばれるGet-ChildItem
に、リンク ループをチェックするパラメーターを追加します。 (#4020) -
CSharpVersion7
をサポートするようにAdd-Type
を更新します。 (#3933)(@iSazonovのおかげで) - サポートされていない API を使用しているため、より適切なソリューションが見つかるまで、
Microsoft.PowerShell.LocalAccounts
モジュールを削除します。 (#4302) - より適切なソリューションが見つかるまで、サポートされていない API を使用しているため、
Microsoft.PowerShell.Diagnostics
の*-Counter
コマンドレットを削除します。 (#4303) -
Invoke-Item -Path <folder>
のサポートを追加します。 (#4262) -
-Extension
スイッチと-LeafBase
スイッチをSplit-Path
に追加して、ファイル名拡張子と残りのファイル名の間でパスを分割できるようにします。 (#2721)(@powercodeのおかげで! - 上位/下位 N の並べ替えの
Sort-Object
にパラメーターの-Top
と-Bottom
を追加する -
System.Diagnostics.Process
にCodeProperty "Parent"
を追加して、プロセスの親プロセスを公開します。 (#2850)(@powercodeのおかげで! -
Get-Process
のメモリ列に KB ではなく MB を使用する -
Out-String
-NoNewLine
スイッチを追加します。 (#5056)(@raghav710に感謝) -
Move-Item
コマンドレットでは、-Include
、-Exclude
、および-Filter
パラメーターが使用されます。 (#3878) -
Remove-Item
のレジストリ パスで*
を使用できるようにします。 (#4866) -
Get-Credential
に-Title
を追加し、プラットフォーム間でプロンプト エクスペリエンスを統合します。 -
Test-Connection
に-TimeOut
パラメーターを追加します。 (#2492) -
Get-AuthenticodeSignature
コマンドレットは、ファイル署名のタイムスタンプを取得できるようになりました。 (#4061) - サポートされていない
-ShowWindow
スイッチをGet-Help
から削除します。 (#4903) - 返される配列要素に区切り記号を含めないように
Get-Content -Delimiter
を修正しました (#3706) (@mklement0に感謝) -
ConvertTo-HTML
にMeta
、Charset
、およびTransitional
パラメーターを追加する (#4184) (@ergo3114に感謝) - 結果に
WindowsUBR
プロパティとWindowsVersion
プロパティGet-ComputerInfo
追加する - パラメーター
-Group
Get-Verb
に追加する -
New-FileCatalog
とTest-FileCatalog
ShouldProcess
サポートを追加します (-WhatIf
と-Confirm
の修正)。 (#3074)(@iSazonovのおかげで! -
-WhatIf
スイッチをStart-Process
コマンドレットに追加する (#4735) (@sarithsuthaに感謝) - 追加
ValidateNotNullOrEmpty
既存のパラメーターが多すぎます。
タブ補完
ランタイム変数の値に基づいて、タブ補完の型推論を強化しました。 (#2744)(@powercodeのおかげで!これにより、次のような状況でタブ補完が可能になります。
$p = Get-Process $p | Foreach-Object Prio<tab>
Select-Object
の-Property
のハッシュテーブル タブ補完を追加します。 (#3625)(@powercodeのおかげで)Select-Object
の-ExcludeProperty
と-ExpandProperty
の引数オートコンプリートを有効にします。 (#3443)(@iSazonovのおかげで!タブ補完のバグを修正して、ネイティブ コンプリート
native.exe --<tab>
呼び出しを行います。 (#3633)(@powercodeのおかげで!
PowerShell 6.0 の破壊的変更
PowerShell Core 6.0 では、いくつかの破壊的変更が導入されました。
デバッグ
-
Invoke-Command -ComputerName
のリモート ステップ イン デバッグのサポート。 (#3015) - PowerShell Core でバインダー デバッグ ログを有効にする
ファイルシステムの更新
- UNC パスからファイルシステム プロバイダーの使用を有効にします。 ($4998)
-
Split-Path
UNC ルートで動作するようになりました - 引数のない
cd
がcd ~
として動作するようになりました - 260 文字を超えるパスを使用できるように PowerShell Core を修正しました。 (#3960)
バグ修正とパフォーマンスの向上
起動時間、さまざまな組み込みコマンドレット、ネイティブ バイナリとの対話など、PowerShell 全体のパフォーマンスに対する多くの 改善を
また、PowerShell Core 内のバグも多数修正されています。 修正プログラムと変更の完全な一覧については、GitHub の changelog を参照してください。
テレメトリー
- PowerShell Core 6.0 では、コンソール ホストにテレメトリが追加され、2 つの値 (#3620) が報告されました。
- OS プラットフォーム (
$PSVersionTable.OSDescription
) - PowerShell の正確なバージョン (
$PSVersionTable.GitCommitId
)
- OS プラットフォーム (
このテレメトリをオプトアウトする場合は、true
、1
、または yes
のいずれかの値 POWERSHELL_TELEMETRY_OPTOUT
環境変数を作成します。 変数を作成すると、PowerShell の最初の実行前であっても、すべてのテレメトリがバイパスされます。 また、このテレメトリ データと、コミュニティ ダッシュボードのテレメトリから収集した分析情報も公開する予定です。 このデータの使用方法の詳細については、この ブログ記事を参照してください。
PowerShell 6.0 用に出荷されていないモジュール
さまざまな互換性の理由から、次のモジュールは PowerShell 6 には含まれていません。
- 伊勢
- 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 Core では PowerShell ワークフローはサポートされていません。
今後は、PowerShell ワークフローを必要とせずに、PowerShell 言語でネイティブ並列処理/コンカレンシーを有効にしたいと考えています。
OS の再起動後にチェックポイントを使用してスクリプトを再開する必要がある場合は、タスク スケジューラを使用して OS の起動時にスクリプトを実行することをお勧めしますが、スクリプトは独自の状態 (ファイルへの永続化など) を維持する必要があります。
カスタム スナップイン
PowerShell スナップイン は、PowerShell コミュニティで広く導入されていない PowerShell モジュールの前身です。
スナップインのサポートが複雑で、コミュニティでの使用が不足しているため、PowerShell Core ではカスタム スナップインはサポートされなくなりました。
現在、これは Windows および Windows Server の ActiveDirectory
モジュールと DnsClient
モジュールを中断します。
WMI v1 コマンドレット
WMI ベースのモジュールの 2 つのセットをサポートする複雑さのため、PowerShell Core から WMI v1 コマンドレットを削除しました。
Register-WmiEvent
Set-WmiInstance
Invoke-WmiMethod
Get-WmiObject
Remove-WmiObject
代わりに、新しい機能と再設計された構文で同じ機能を提供する CIM (WMI v2) コマンドレットを使用することをお勧めします。
Get-CimAssociatedInstance
Get-CimClass
Get-CimInstance
Get-CimSession
Invoke-CimMethod
New-CimInstance
New-CimSession
New-CimSessionOption
Register-CimIndicationEvent
Remove-CimInstance
Remove-CimSession
Set-CimInstance
Microsoft.PowerShell.LocalAccounts
サポートされていない API の使用により、より適切なソリューションが見つかるまで、Microsoft.PowerShell.LocalAccounts
は PowerShell Core から削除されています。
コマンドレット New-WebServiceProxy
削除されました
.NET Core では、SOAP プロトコルを使用するためのサービスを提供する Windows Communication Framework はサポートされていません。 このコマンドレットは SOAP を必要とするため削除されました。
*-Transaction
コマンドレットが削除されました
これらのコマンドレットの使用方法は非常に限られています。 彼らのサポートを中止することを決定しました。
Complete-Transaction
Get-Transaction
Start-Transaction
Undo-Transaction
Use-Transaction
Windows 以外のプラットフォームでは使用できないセキュリティ コマンドレット
Get-Acl
Set-Acl
Get-AuthenticodeSignature
Set-AuthenticodeSignature
Get-CmsMessage
Protect-CmsMessage
Unprotect-CmsMessage
New-FileCatalog
Test-FileCatalog
*-Computer
およびその他の Windows 固有のコマンドレット
サポートされていない API を使用しているため、より適切なソリューションが見つかるまで、次のコマンドレットが PowerShell Core から削除されています。
Get-Clipboard
Set-Clipboard
Add-Computer
Checkpoint-Computer
Remove-Computer
Restore-Computer
Reset-ComputerMachinePassword
Disable-ComputerRestore
Enable-ComputerRestore
Get-ComputerRestorePoint
Test-ComputerSecureChannel
Get-ControlPanelItem
Show-ControlPanelItem
Get-HotFix
Clear-RecycleBin
Update-List
Out-Printer
ConvertFrom-String
Convert-String
*-Counter
コマンドレット
サポートされていない API を使用しているため、より適切なソリューションが見つかるまで、*-Counter
は PowerShell Core から削除されています。
*-EventLog
コマンドレット
サポートされていない API の使用により、*-EventLog
は PowerShell Core から削除されました。 より良い解決策が見つかるまで。
Get-WinEvent
と New-WinEvent
を使用して、Windows でイベントを取得および作成できます。
WPF を使用するコマンドレットが削除されました
Windows Presentation Framework は CoreCLR ではサポートされていません。 次のコマンドレットが影響を受ける。
Show-Command
Out-GridView
-
Get-Help
の showwindow パラメーター
一部の DSC コマンドレットが削除されました
Get-DscConfiguration
Publish-DscConfiguration
Restore-DscConfiguration
Start-DscConfiguration
Stop-DscConfiguration
Test-DscConfiguration
Update-DscConfiguration
Remove-DscConfigurationDocument
Get-DscConfigurationStatus
Disable-DscDebug
Enable-DscDebug
Get-DscLocalConfigurationManager
Set-DscLocalConfigurationManager
Invoke-DscResource
エンジン/言語の変更
powershell.exe
の名前を pwsh.exe
#5101 に変更する
(Windows PowerShell ではなく) Windows で PowerShell Core を呼び出す決定的な方法をユーザーに提供するために、PowerShell Core バイナリは Windows 上で pwsh.exe
に変更され、Windows 以外のプラットフォームでは pwsh
されました。
短縮名は、Windows 以外のプラットフォームでのシェルの名前付けとも一致します。
#5193 出力に改行を挿入しない (テーブルを除く)
以前は、出力は本体の幅に合わせられ、改行は本体の最後の幅に追加されていました。つまり、ターミナルのサイズが変更された場合、出力は想定どおりに再フォーマットされませんでした。 この変更は、列の配置を維持するために改行が必要なテーブルには適用されませんでした。
値型の要素型を持つコレクションの null 要素チェックをスキップ #5432
Mandatory
パラメーターと ValidateNotNull
属性と ValidateNotNullOrEmpty
属性については、コレクションの要素型が値型であるかどうかを null 要素チェックをスキップします。
ASCII #5369 ではなく、UTF-8 NoBOM
エンコードを使用するように $OutputEncoding
を変更する
以前のエンコード ASCII (7 ビット) では、場合によっては出力が正しく変更されません。 この変更により、UTF-8 NoBOM
既定になり、ほとんどのツールとオペレーティング システムでサポートされているエンコードで Unicode 出力が保持されます。
#5268 ほとんどの既定のエイリアスから を削除する
スコープの作成を高速化するために、AllScope
はほとんどの既定のエイリアスから削除されました。
AllScope
は、頻繁に使用されるいくつかのエイリアスに残されていましたが、検索が高速でした。
#5113 と がオーバーライドされなくなりました
以前は、-Verbose
または -Debug
を指定した場合、$ErrorActionPreference
の動作が過剰に実行されていました。 この変更により、-Verbose
と -Debug
は $ErrorActionPreference
の動作に影響を与えなくなりました。
コマンドレットの変更
データが返されない場合、Invoke-RestMethod は有用な情報を返しません。 #5320
API が null
だけを返すとき、Invoke-RestMethod は $null
の代わりに文字列 "null"
としてこれをシリアル化していました。 この変更により、有効な単一値 JSON null
リテラルを $null
として適切にシリアル化するための Invoke-RestMethod
のロジックが修正されます。
#5277 コマンドレットから 削除する
CoreFX での RPC リモート処理 (特に Windows 以外のプラットフォーム) の問題と、PowerShell での一貫したリモート処理エクスペリエンスの確保により、-Protocol
パラメーターは \*-Computer
コマンドレットから削除されました。 DCOM はリモート処理でサポートされなくなりました。 次のコマンドレットは、WSMAN リモート処理のみをサポートします。
- Rename-Computer
- Restart-Computer
- Stop-Computer
#5090 コマンドレットから 削除する
PSRP の一貫した使用を促進するために、-ComputerName
パラメーターは *-Service
コマンドレットから削除されました。
エラー #5197 を返すために a*b
が実際に存在しない場合の Get-Item -LiteralPath a*b
を修正
以前 -LiteralPath
ワイルドカードを指定すると、ワイルドカードは -Path
と同じように扱われ、ワイルドカードでファイルが見つからなかった場合は自動的に終了します。 正しい動作は、-LiteralPath
がリテラルであるため、ファイルが存在しない場合はエラーになります。 変更は、-Literal
で使用されるワイルドカードをリテラルとして扱うことです。
Import-Csv
は、CSV #5134 に型情報が存在する場合に、インポート時に PSTypeNames
を適用する必要があります
以前は、ConvertFrom-Csv
でインポート TypeInformation
Export-CSV
を使用してエクスポートされたオブジェクトは、型情報を保持していません。 この変更により、CSV ファイルから使用可能な場合 PSTypeNames
メンバーに型情報が追加されます。
-NoTypeInformation
Export-Csv
#5131 では既定値にする必要があります
この変更は、型情報を含めるために Export-CSV
の既定の動作に関するお客様のフィードバックに対処するために行われました。
以前は、コマンドレットは、オブジェクトの型名を含む最初の行としてコメントを出力していました。 変更は、ほとんどのツールでは認識されないため、既定ではこれを抑制することです。
-IncludeTypeInformation
を使用して、前の動作を保持します。
#5112 暗号化されていない接続経由で -Credential
が送信されると、Web コマンドレットで警告が表示
HTTP を使用すると、パスワードを含むコンテンツがクリア テキストとして送信されます。 この変更は、既定ではこれを許可せず、資格情報が安全でない方法で渡される場合にエラーを返すことです。 ユーザーは、-AllowUnencryptedAuthentication
スイッチを使用してこれをバイパスできます。
API の変更
#5407 クラス 削除する
パフォーマンスを向上させるために、AddTypeCommandBase
クラスが Add-Type
から削除されました。 このクラスは、Add-Type コマンドレットによってのみ使用され、ユーザーに影響を与えるべきではありません。
パラメーター -Encoding
を使用してコマンドレットを型 System.Text.Encoding
#5080 に統合する
Byte
-Encoding
値は、ファイルシステム プロバイダーコマンドレットから削除されました。 新しいパラメーター -AsByteStream
を使用して、バイト ストリームが入力として必要であるか、出力がバイト ストリームであることを指定できるようになりました。
#5055 、空のパラメーターと null パラメーターのエラー メッセージをより適切に追加する
以前は、空の書式指定文字列を -UFormat
に渡すと、役に立たないエラー メッセージが表示されます。 よりわかりやすいエラーが追加されました。
#4995 コンソール コードをクリーンアップする
PowerShell Core ではサポートされていないため、次の機能は削除されました。また、Windows PowerShell の従来の理由からサポートを追加する予定はありません。-psconsolefile
スイッチとコード、-importsystemmodules
スイッチとコード、フォント変更コードです。
#4942 サポート 削除されました
以前は、API を使用してプログラムによって PowerShell 実行空間を作成する場合は、レガシ RunspaceConfiguration
以降の InitialSessionState
を使用できました。 この変更により、RunspaceConfiguration
のサポートが削除され、InitialSessionState
のみがサポートされます。
$args
#4923 ではなく、引数を $input
にバインド CommandInvocationIntrinsics.InvokeScript
パラメーターの位置が正しくないと、引数ではなく入力として引数が渡されます。
サポートされていない -showwindow
スイッチを Get-Help
#4903 から削除する
-showwindow
は、CoreCLR ではサポートされていない WPF に依存しています。
Remove-Item
#4866 のレジストリ パスで * を使用できるようにする
以前 -LiteralPath
ワイルドカードを指定すると、ワイルドカードは -Path
と同じように扱われ、ワイルドカードでファイルが見つからなかった場合は自動的に終了します。 正しい動作は、-LiteralPath
がリテラルであるため、ファイルが存在しない場合はエラーになります。 変更は、-Literal
で使用されるワイルドカードをリテラルとして扱うことです。
#4802 失敗したテスト を修正する
以前は、New-Service -StartupType foo
が使用されていた場合、foo
は無視され、既定のスタートアップの種類でサービスが作成されていました。 この変更は、無効なスタートアップの種類に対してエラーを明示的にスローするためです。
$IsOSX
の名前を $IsMacOS
#4700 に変更する
PowerShell での名前付けは、名前付けと一貫性があり、OSX ではなく Apple による macOS の使用に準拠している必要があります。 しかし、読みやすくするために、一貫してパスカルの大文字と小文字を使用しています。
無効なスクリプトが -File に渡されたときにエラー メッセージの一貫性を保ち、あいまいな引数を #4573 渡した場合のエラーを改善
unix 規則に合わせて pwsh.exe
の終了コードを変更する
Diagnostics
モジュールからの LocalAccount
とコマンドレットの削除。
#4302#4303
サポートされていない API により、LocalAccounts
モジュールと、Diagnostics
モジュール内の Counter
コマンドレットは、より適切なソリューションが見つかるまで削除されました。
bool パラメーターを使用して PowerShell スクリプトを実行しても、#4036 機能しません
以前は、powershell.exe (現在 pwsh.exe) を使用して、-File
を使用して PowerShell スクリプトを実行しても、パラメーター値として $true
/$false
を渡す方法がありませんでした。 パラメーターに解析された値としての $true
/$false
のサポートが追加されました。 現在文書化されている構文が機能しないため、スイッチ値もサポートされています。
$PSVersionTable
#4027 からプロパティ ClrVersion
削除する
$PSVersionTable
の ClrVersion
プロパティは CoreCLR では役に立ちません。エンド ユーザーはその値を使用して互換性を判断しないでください。
powershell.exe
の位置指定パラメーターを -Command
から -File
#4019 に変更
Windows 以外のプラットフォームで PowerShell の shebang の使用を有効にします。 つまり、Unix ベースのシステムでは、pwsh
を明示的に呼び出すのではなく、PowerShell を自動的に呼び出すスクリプト実行可能ファイルを作成できます。 これはまた、-File
を指定せずに powershell foo.ps1
や powershell fooScript
などを行うことができることを意味します。 ただし、この変更では、powershell.exe Get-Command
などの操作を行うときに、-c
または -Command
を明示的に指定する必要があります。
Unicode エスケープ解析 #3958 を実装する
`u####
または `u{####}
は、対応する Unicode 文字に変換されます。 リテラル `u
を出力するには、backtick: ``u
をエスケープします。
New-ModuleManifest
エンコードを Windows 以外のプラットフォームで UTF8NoBOM
に変更 #3940
以前は、New-ModuleManifest
は BOM を使用して UTF-16 で psd1 マニフェストを作成し、Linux ツールに問題が発生しました。 この破壊的変更により、windows 以外のプラットフォームでは、New-ModuleManifest
のエンコードが UTF (BOM なし) に変更されます。
Get-ChildItem
がシンボリック リンクに再帰しないようにします (#1875)。
#3780
この変更により、Unix ls -r
と Windows dir /s
ネイティブ コマンドに合わせて Get-ChildItem
が増えます。 前述のコマンドと同様に、コマンドレットは再帰中に見つかったディレクトリへのシンボリック リンクを表示しますが、再帰は行いません。
#3706 で返される行に区切り記号を含めないように 修正しました
以前は、Get-Content -Delimiter
を使用している間の出力は一貫性がなく、区切り記号を削除するためにデータをさらに処理する必要があるため、不便でした。 この変更により、返される行の区切り記号が削除されます。
C# #3320 で Format-Hex を実装する
-Raw
パラメーターが "no-op" になりました (何も行わないという点で)。 今後、すべての出力は、その型のすべてのバイトを含む数値の真の表現で表示されます (この変更の前に -Raw
パラメーターが正式に行ったもの)。
既定のシェルとしての PowerShell は、スクリプト コマンド #3319
Unix では、シェルが対話型シェルの -i
を受け入れる規則であり、多くのツールではこの動作 (script
たとえば、PowerShell を既定のシェルとして設定する場合など) を想定し、-i
スイッチを使用してシェルを呼び出します。 この変更は、-i
以前は -inputformat
に一致させるために短い手として使用することができ、-in
する必要があるという点で破壊的です。
プロパティ名 Get-ComputerInfo #3167 の入力ミスを修正
BiosSerialNumber
は BiosSeralNumber
としてスペルミスされ、正しいスペルに変更されました。
#3024 コマンドレットと コマンドレットを追加する
この変更により、一部のハッシュ アルゴリズムは CoreFX でサポートされていないため、使用できなくなります。
MACTripleDES
RIPEMD160
エラー #2672 の代わりに、$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-PSSnapin -Name
Get-Runspace -Name
Get-RunspaceDebug -RunspaceName
Get-Service -Name
Get-TraceSource -Name
Get-Variable -Name
Get-WmiObject -Class
Get-WmiObject -Property
Import-Csv
#2482 でサポート W3C 拡張ログ ファイル形式を追加する
以前は、Import-Csv
コマンドレットを使用して W3C 拡張ログ形式でログ ファイルを直接インポートすることはできず、追加のアクションが必要です。 この変更により、W3C 拡張ログ形式がサポートされます。
PS 関数の ValueFromRemainingArguments
に関するパラメーター バインドの問題 #2035
ValueFromRemainingArguments
は、それ自体が配列である単一の値ではなく、配列として値を返すようになりました。
BuildVersion
は $PSVersionTable
#1415 から削除されます
$PSVersionTable
から BuildVersion
プロパティを削除します。 このプロパティは、Windows ビルド バージョンに関連付けされていました。 代わりに、GitCommitId
を使用して PowerShell Core の正確なビルド バージョンを取得することをお勧めします。
Web コマンドレットの変更
Web コマンドレットの基になる .NET API が System.Net.Http.HttpClient
に変更されました。 この変更には多くの利点があります。 ただし、この変更と Internet Explorer との相互運用性の欠如により、Invoke-WebRequest
と Invoke-RestMethod
内でいくつかの破壊的変更が発生しました。
-
Invoke-WebRequest
は基本的な HTML 解析のみをサポートするようになりました。Invoke-WebRequest
は常にBasicHtmlWebResponseObject
オブジェクトを返します。ParsedHtml
プロパティとForms
プロパティが削除されました。 -
String
の代わりに、BasicHtmlWebResponseObject.Headers
値がString[]
されるようになりました。 -
BasicHtmlWebResponseObject.BaseResponse
がSystem.Net.Http.HttpResponseMessage
オブジェクトになりました。 - Web コマンドレット例外の
Response
プロパティがSystem.Net.Http.HttpResponseMessage
オブジェクトになりました。 - 厳密な RFC ヘッダーの解析が、
-Headers
および-UserAgent
パラメーターの既定になりました。 これは、-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 にする必要があります。