Windows PowerShell 5.1 から PowerShell 7 への移行

クラウド、オンプレミス、およびハイブリッド環境向けに設計された PowerShell 7 には、強化された機能と新機能が組み込まれています。

  • Windows PowerShell とのサイド バイ サイドのインストールおよび実行
  • 既存の Windows PowerShell モジュールとの強化された互換性
  • 三項演算子や ForEach-Object -Parallel などの新しい言語機能
  • パフォーマンスの向上
  • SSH ベースのリモート処理
  • クロス プラットフォームの相互運用性
  • Docker コンテナーのサポート

PowerShell 7 は Windows PowerShell とサイド バイ サイドで動作するため、簡単にテストを行い、展開前にエディション間で比較することができます。 簡単に、すばやく、安全に移行できます。

PowerShell 7 は、次の Windows オペレーティング システムでサポートされています。

  • Windows 10、11
  • Windows Server 2016、2019、および 2022

PowerShell 7 は、macOS と、いくつかの Linux ディストリビューションでも実行できます。 サポートされているオペレーティング システムの一覧と、サポート ライフサイクルの詳細については、「PowerShell のサポート ライフサイクル」をご覧ください。

PowerShell 7 のインストール

柔軟性を確保し、IT、DevOps エンジニア、および開発者のニーズに対応するために、PowerShell 7 のインストールにはいくつかのオプションが用意されています。 ほとんどの場合、インストール オプションは次の方法に絞ることができます。

Note

MSI パッケージは、Microsoft Configuration Manager などの管理製品を使って展開および更新できます。 GitHub リリース ページからパッケージをダウンロードしてください。

MSI パッケージを展開するには、管理者権限が必要です。 ZIP パッケージは、任意のユーザーが展開できます。 ZIP パッケージは、完全インストールを実行する前にテスト用の PowerShell 7 をインストールするための最も簡単な方法です。

Windows ストアまたは winget から PowerShell 7 をインストールすることもできます。 これらの方法の詳細については、「Windows への PowerShell のインストール」にある詳細な手順を参照してください。

PowerShell 7 を Windows PowerShell 5.1 とサイド バイ サイドで使用する

PowerShell 7 は、Windows PowerShell 5.1 と共存するように設計されています。 次の機能により、ユーザーの PowerShell への投資が確実に保護され、PowerShell 7 への移行が簡単になります。

  • 個別のインストール パスと実行可能ファイル名
  • 個別の PSModulePath
  • バージョンごとに個別のプロファイル
  • 強化されたモジュールの互換性
  • 新しいリモート処理エンドポイント
  • グループ ポリシーのサポート
  • 個別のイベント ログ

.NET バージョンの相違点

PowerShell 7.2 は .NET 6.0 上に構築されています。 Windows PowerShell 5.1 は .NET Framework 4.x の上に構築されています。 .NET バージョン間の違いは、特に .NET メソッドを直接呼び出す場合に、スクリプトの動作に影響する可能性があります。 詳細については、「Windows PowerShell 5.1 と PowerShell 7.x の相違点」を参照してください。

個別のインストール パスと実行可能ファイル名

PowerShell 7 は新しいディレクトリにインストールされ、Windows PowerShell 5.1 とのサイド バイ サイド実行が可能になります。

バージョン別のインストール場所:

  • Windows PowerShell 5.1: $env:WINDIR\System32\WindowsPowerShell\v1.0
  • PowerShell 6.x: $env:ProgramFiles\PowerShell\6
  • PowerShell 7: $env:ProgramFiles\PowerShell\7

新しい場所が PATH に追加され、Windows PowerShell 5.1 と PowerShell 7 の両方を実行できるようになります。 Powershell 6.x から PowerShell 7 に移行する場合は、PowerShell 6 が削除され、PATH が置き換えられます。

Windows PowerShell では、PowerShell の実行可能ファイルには powershell.exe という名前が付けられます。 バージョン 6 以降では、実行可能ファイルには pwsh.exe という名前が付けられます。 新しい名前を使用すると、両方のバージョンのサイド バイ サイド実行をサポートしやすくなります。

個別の PSModulePath

既定では、Windows PowerShell と PowerShell 7 では異なる場所にモジュールが格納されます。 PowerShell 7 では、これらの場所を組み合わせたものが $Env:PSModulePath 環境変数に設定されます。 モジュールを名前でインポートする場合、PowerShell では $Env:PSModulePath で指定された場所がチェックされます。 これにより、PowerShell 7 では Core モジュールと Desktop モジュールの両方を読み込むことができます。

インストール スコープ Windows PowerShell 5.1 PowerShell 7.0
PowerShell モジュール $env:WINDIR\system32\WindowsPowerShell\v1.0\Modules $env:ProgramFiles\PowerShell\7\Modules
ユーザー インストール
AllUsers スコープ
$env:ProgramFiles\WindowsPowerShell\Modules $env:ProgramFiles\PowerShell\Modules
ユーザー インストール
CurrentUser スコープ
$HOME\Documents\WindowsPowerShell\Modules $HOME\Documents\PowerShell\Modules

次の例では、各バージョンの $Env:PSModulePath の既定値を示します。

  • Windows PowerShell 5.1 の場合:

    $Env:PSModulePath -split (';')
    
    C:\Users\<user>\Documents\WindowsPowerShell\Modules
    C:\Program Files\WindowsPowerShell\Modules
    C:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules
    
  • PowerShell 7 の場合:

    $Env:PSModulePath -split (';')
    
    C:\Users\<user>\Documents\PowerShell\Modules
    C:\Program Files\PowerShell\Modules
    C:\Program Files\PowerShell\7\Modules
    C:\Program Files\WindowsPowerShell\Modules
    C:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules
    

PowerShell 7 では、モジュールの自動読み込みを行うために、Windows PowerShell のパスと PowerShell 7 のパスが含まれていることがわかります。

注意

PSModulePath 環境変数を変更した場合、またはカスタムのモジュールかアプリケーションをインストールした場合は、追加のパスが存在する可能性があります。

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

モジュールの詳細については、「about_Modules」をご覧ください。

個別のプロファイル

PowerShell プロファイルは、PowerShell の起動時に実行されるスクリプトです。 このスクリプトでは、コマンド、エイリアス、関数、変数、モジュール、PowerShell ドライブを追加して、環境をカスタマイズできます。 プロファイル スクリプトを使用すると、すべてのセッションでこれらのカスタマイズを利用できるようになり、手動で再作成する必要がなくなります。

PowerShell 7 では、プロファイルの場所へのパスが変更されています。

  • Windows PowerShell 5.1 では、プロファイルの場所は $HOME\Documents\WindowsPowerShell です。
  • PowerShell 7 では、プロファイルの場所は $HOME\Documents\PowerShell です。

プロファイルのファイル名も変更されています。

$PROFILE | Select-Object *Host* | Format-List
 AllUsersAllHosts       : C:\Program Files\PowerShell\7\profile.ps1
 AllUsersCurrentHost    : C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1
 CurrentUserAllHosts    : C:\Users\<user>\Documents\PowerShell\profile.ps1
 CurrentUserCurrentHost : C:\Users\<user>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

詳細については、「about_Profiles」をご覧ください。

PowerShell 7 の Windows PowerShell 5.1 モジュールとの互換性

Windows PowerShell 5.1 でお使いのほとんどのモジュールは、Azure PowerShell と Active Directory を含めて、既に PowerShell 7 で動作しています。 私たちは、他のチームと協力して、Microsoft Graph、Office 365 などを始めとする、さらに多くのモジュールの PowerShell 7 ネイティブ サポートを追加する作業を続けています。 サポートされているモジュールの最新の一覧については、「PowerShell 7 モジュールの互換性」をご覧ください。

注意

Windows では、Import-ModuleUseWindowsPowerShell スイッチも追加されており、互換性のないモジュールを使用するユーザーが簡単に PowerShell 7 に切り替えられます。 この機能の詳細については、「about_Windows_PowerShell_Compatibility」をご覧ください。

PowerShell リモート処理

PowerShell リモート処理を使用すると、1 台以上のリモート コンピューター上で任意の PowerShell コマンドを実行できます。 永続的な接続の確立、対話型のセッションの開始、およびリモート コンピューターでのスクリプトの実行が可能です。

WS-Management リモート処理

Windows PowerShell 5.1 以前では、接続ネゴシエーションとデータ転送のために WS-Management (WSMAN) プロトコルが使用されます。 Windows リモート管理 (WinRM) では、WSMAN プロトコルが使用されます。 WinRM が有効になっている場合、PowerShell 7 では、リモート接続のために Microsoft.PowerShell という名前の既存の Windows PowerShell 5.1 エンドポイントが使用されます。 PowerShell 7 を更新して独自のエンドポイントを追加するには、Enable-PSRemoting コマンドレットを実行します。 特定のエンドポイントへの接続について詳しくは、PowerShell の WS-Management リモート処理に関する記事をご覧ください

Windows PowerShell のリモート処理を使用するには、リモート管理のためにリモート コンピューターを構成する必要があります。 手順を含む詳細については、「about_Remote_Requirements」をご覧ください。

リモート処理の使用について詳しくは、「リモートについて」をご覧ください。

SSH ベースのリモート処理

SSH ベースのリモート処理は、WinRM のような Windows ネイティブ コンポーネントを使用できない他のオペレーティング システムをサポートするために、PowerShell 6.x に追加されました。 SSH リモート処理で、SSH サブシステムとしてターゲット コンピューター上に PowerShell ホスティング プロセスを作成します。 Windows または Linux で SSH ベースのリモート処理を設定する方法の詳細と例については、次を参照してください:「SSH 経由の PowerShell リモート処理」。

注意

PowerShell ギャラリー (PSGallery) には、SSH ベースのリモート処理を自動的に構成するモジュールとコマンドレットが含まれています。 PSGallery から Microsoft.PowerShell.RemotingTools モジュールをインストールし、Enable-SSH コマンドレットを実行してください。

New-PSSessionEnter-PSSession、および Invoke-Command コマンドレットには、SSH 接続をサポートする新しいパラメーター セットがあります。

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

リモート セッションを作成するには、HostName パラメーターでターゲット コンピューターを指定し、UserName でユーザー名を指定します。 コマンドレットを対話的に実行する場合は、パスワードの入力を求められます。

Enter-PSSession -HostName <Computer> -UserName <Username>

または、HostName パラメーターを使用する場合は、ユーザー名の情報に続けてアットマーク (@) を入力し、続けてコンピューター名を指定します。

Enter-PSSession -HostName <Username>@<Computer>

KeyFilePath パラメーターを指定して、プライベート キー ファイルを使用する SSH キー認証を設定できます。 詳細については、「OpenSSH キーの管理」をご覧ください。

グループ ポリシーのサポート

PowerShell には、エンタープライズ環境内の各サーバーに対して一貫したオプション値を定義するのに役立つ、グループ ポリシー設定が含まれています。 これらの設定には、以下が含まれます。

  • コンソール セッションの構成:PowerShell を実行する構成エンドポイントを設定します。
  • モジュール ログを有効にする:モジュールの LogPipelineExecutionDetails プロパティを設定します。
  • PowerShell スクリプト ブロックのログ記録を有効にする:すべての PowerShell スクリプトの詳細なログ記録を有効にします。
  • スクリプトの実行を有効にする:PowerShell 実行ポリシーを設定します。
  • PowerShell トランスクリプションを有効にする: PowerShell コマンドの入出力をテキスト ベースのトランスクリプトにキャプチャできるようにします。
  • Update-Help の既定のソース パスを設定する:更新可能なヘルプのソースを、インターネットではなく、ディレクトリに設定します。

詳細については、「about_Group_Policy_Settings」をご覧ください。

PowerShell 7 では、グループ ポリシーのテンプレートとインストール スクリプトが $PSHOME に含まれています。

グループ ポリシー ツールでは、管理用テンプレート ファイル (.admx.adml) を使用して、ユーザー インターフェイスにポリシー設定を追加できます。 これにより、管理者はレジストリ ベースのポリシー設定を管理できます。 InstallPSCorePolicyDefinitions.ps1 スクリプトを使用すると、ローカル コンピューターに PowerShell 管理用テンプレートがインストールされます。

Get-ChildItem -Path $PSHOME -Filter *Core*Policy*
    Directory: C:\Program Files\PowerShell\7

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2/27/2020 12:38 AM          15861 InstallPSCorePolicyDefinitions.ps1
-a---           2/27/2020 12:28 AM           9675 PowerShellCoreExecutionPolicy.adml
-a---           2/27/2020 12:28 AM           6201 PowerShellCoreExecutionPolicy.admx

個別のイベント ログ

Windows PowerShell と PowerShell 7 では、個別のイベント ログにイベントのログが記録されます。 PowerShell ログの一覧を取得するには、次のコマンドを使用します。

Get-WinEvent -ListLog *PowerShell*

詳細については、「about_Logging_Windows」をご覧ください。

Visual Studio Code を使用した編集エクスペリエンスの向上

PowerShell 拡張機能を使用した Visual Studio Code (VSCode) は、PowerShell 7 でサポートされているスクリプト環境です。 Windows PowerShell Integrated Scripting Environment (ISE) では、Windows PowerShell のみがサポートされています。

更新された PowerShell 拡張機能には、次が含まれます。

  • 新しい ISE 互換モード
  • 統合コンソールでの PSReadLine (構文の強調表示、複数行の編集、バック検索を含む)
  • 安定性とパフォーマンスの向上
  • 新しい CodeLens 統合
  • パスのオートコンプリートの向上

簡単に Visual Studio Code への移行を行うには、コマンド パレットで使用できる ISE モードの有効化機能を使用します。 この機能を使うと、VSCode が ISE スタイルのレイアウトに切り替わります。 ISE スタイルのレイアウトでは、使い慣れたユーザー エクスペリエンスで、PowerShell のすべての新機能を使用できます。

新しい ISE レイアウトに切り替えるには、Ctrl+Shift+P キーを押してコマンド パレットを開き、「PowerShell」と入力して次を選択します: [PowerShell:Enable ISE Mode]\(PowerShell: ISE モードの有効化\)

レイアウトを元のレイアウトに設定するには、コマンド パレットを開き、次を選択します: [PowerShell:Disable ISE Mode (restore to defaults)]\(PowerShell: ISE モードの無効化 (既定値に戻す)\)

VSCode のレイアウトを ISE にカスタマイズする方法の詳細については、「Visual Studio Code で ISE のエクスペリエンスをレプリケートする方法」をご覧ください

注意

新しい機能で ISE を更新する予定はありません。 最新バージョンの Windows 10 および Windows Server 2019 以降、ISE はユーザーがアンインストール可能な機能になりました。 ISE を完全に削除する予定はありません。 PowerShell チームとそのパートナーは、Visual Studio Code 用の PowerShell 拡張機能におけるスクリプト作成エクスペリエンスの改善に重点を置いています。

次の手順

効率的に移行を行うための知識が身に付いたら、すぐに PowerShell 7 をインストールしましょう。