次の方法で共有


PowerShell Core 6.0 の新機能

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 にあります。
  • Unix でのコロン文字を含むファイル名とフォルダー名のサポート。 (#4959)
  • コンマを持つスクリプト名または完全なパスのサポート。 (#4136)(@TimCurwickのおかげで!
  • ナビゲーション コマンドレットのワイルドカード展開を抑制するために -LiteralPath が使用されるタイミングを検出します。 (#5038)
  • *nix ls -R や Windows DIR /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.ps1pwsh fooScript などのコマンドを実行することもできます。 ただし、この変更を行うには、pwsh.exe -Command Get-Commandなどのコマンドを実行するときに、-c または -Command を明示的に指定する必要があります。 (#4019)
  • PowerShell Core は、対話型シェルを示す -i (または -Interactive) スイッチを受け入れます。 (#3558)これにより、PowerShell を Unix プラットフォームの既定のシェルとして使用できます。
  • pwsh.exeからパラメーターの -importsystemmodules-psconsoleFile を削除しました。 (#4995)
  • 他のネイティブ ツールに合わせて pwsh.exepwsh -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.ManagementMicrosoft.PowerShell.Utilityなど) が Windows PowerShell と同じように動作するように、ベスト エフォートが行われています。 多くの場合、コミュニティの助けを借りて、これらのコマンドレットに新しい機能とバグ修正を追加しました。 場合によっては、基になる .NET レイヤーに依存関係がないため、機能が削除されたか、使用できません。

Windows の一部として出荷されるモジュール (たとえば、など) と、Azure や Office を含む他の Microsoft 製品は、まだ .NET Core に明示的に されていません。 PowerShell チームは、これらの製品グループとチームと協力して、既存のモジュールを検証し、PowerShell Core に移植しています。 .NET Standard と CDXMLでは、これらの従来の Windows PowerShell モジュールの多くは PowerShell Core で動作するように見えますが、正式には検証されておらず、正式にはサポートされていません。

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の のタグを確認してください。 Docker と PowerShell Core の詳細については、GitHub Docker を参照してください。

SSH ベースの PowerShell リモート処理

PowerShell リモート処理プロトコル (PSRP) は、従来の WinRM ベースの PSRP に加えて、Secure Shell (SSH) プロトコルでも動作するようになりました。

つまり、Enter-PSSessionNew-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 インスタンスと、MajorMinor バージョンの値でのみ構築される 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 で UnixWin32NT に設定することによって返されます。
  • $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のおかげで!
  • $PSHomepowershell.config.json という名前の JSON 構成ファイルを追加して、起動前に必要な設定 (ExecutionPolicyなど) を格納します。
  • Windows EXE の実行時にパイプラインをブロックしない
  • COM コレクションの列挙を有効にしました。 (#4553)

コマンドレットの更新

新しいコマンドレット

  • Microsoft.PowerShell.UtilityGet-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 パラメーター値に達するまで、nextrel リンクを自動的にフォローします。
  • -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 を追加します。
  • -ResponseHeadersVariableInvoke-RestMethod に追加して、応答ヘッダーのキャプチャを有効にします。 (#4888)(@markekrausに感謝)
  • 応答状態コードが成功しなかった場合に、例外に HTTP 応答を含める Web コマンドレットを修正します。 (#3201)
  • Web コマンドレットの UserAgentWindowsPowerShell から 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-CsvConvertFrom-CsvPSTypeName サポートを追加します。 (#5389)(@markekrausありがとう!
  • 行区切り記号 Import-CsvCRLF、および CRLF をサポートするようにします。 (#5363)(@iSazonovありがとう!
  • Export-CsvConvertTo-Csvの既定値 -NoTypeInformation します。 (#5164)(@markekrausありがとう!

サービス コマンドレット

  • プロパティ UserNameDescriptionDelayedAutoStartBinaryPathName、および 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.ProcessCodeProperty "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-HTMLMetaCharset、および Transitional パラメーターを追加する (#4184) (@ergo3114に感謝)
  • 結果に WindowsUBR プロパティと WindowsVersion プロパティ Get-ComputerInfo 追加する
  • パラメーター -GroupGet-Verb に追加する
  • New-FileCatalogTest-FileCatalogShouldProcess サポートを追加します (-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 ルートで動作するようになりました
  • 引数のない cdcd ~ として動作するようになりました
  • 260 文字を超えるパスを使用できるように PowerShell Core を修正しました。 (#3960)

バグ修正とパフォーマンスの向上

起動時間、さまざまな組み込みコマンドレット、ネイティブ バイナリとの対話など、PowerShell 全体のパフォーマンスに対する多くの 改善を しました。

また、PowerShell Core 内のバグも多数修正されています。 修正プログラムと変更の完全な一覧については、GitHub の changelog を参照してください。

テレメトリー

  • PowerShell Core 6.0 では、コンソール ホストにテレメトリが追加され、2 つの値 (#3620) が報告されました。
    • OS プラットフォーム ($PSVersionTable.OSDescription)
    • PowerShell の正確なバージョン ($PSVersionTable.GitCommitId)

このテレメトリをオプトアウトする場合は、true1、または 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-WinEventNew-WinEvent を使用して、Windows でイベントを取得および作成できます。

WPF を使用するコマンドレットが削除されました

Windows Presentation Framework は CoreCLR ではサポートされていません。 次のコマンドレットが影響を受ける。

  • Show-Command
  • Out-GridView
  • Get-Helpshowwindow パラメーター

一部の 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 でインポート TypeInformationExport-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 削除する

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

powershell.exe の位置指定パラメーターを -Command から -File#4019 に変更

Windows 以外のプラットフォームで PowerShell の shebang の使用を有効にします。 つまり、Unix ベースのシステムでは、pwshを明示的に呼び出すのではなく、PowerShell を自動的に呼び出すスクリプト実行可能ファイルを作成できます。 これはまた、-Fileを指定せずに powershell foo.ps1powershell 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 なし) に変更されます。

この変更により、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 の入力ミスを修正

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

#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-WebRequestInvoke-RestMethod内でいくつかの破壊的変更が発生しました。

  • Invoke-WebRequest は基本的な HTML 解析のみをサポートするようになりました。 Invoke-WebRequest は常に BasicHtmlWebResponseObject オブジェクトを返します。 ParsedHtml プロパティと Forms プロパティが削除されました。
  • Stringの代わりに、BasicHtmlWebResponseObject.Headers 値が String[] されるようになりました。
  • BasicHtmlWebResponseObject.BaseResponseSystem.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 にする必要があります。