🔘

PowerShell 6.0以降(Core)導入有無によって実行するバージョンを切り分ける方法

2024/04/03に公開

概要

複数のWindows環境でPowerShellスクリプトを実行したい場合、環境によって実行するPowerShellのバージョンを切り替えたいケースがありました。
PowerShellバージョン 6.0以降のCore エディションを導入済みの場合は、pwsh.exeでPowerShellスクリプトを実行し、
未導入の場合は、Windows標準のPowerShellバージョン 5.1、powershell.exeで実行する方法を紹介。

この記事のターゲット

  • PowerShellユーザーの方
  • 6.0以降のCoreエディションを導入有無によって実行するPowerShellバージョンを切り分けたい方
    • 6.0以降のCoreエディションを導入済みの場合、pwsh.exeでPowerShellスクリプトを実行
    • 未導入の場合、powershell.exe(標準5.1バージョン)で実行

対応方法

PowerShellで実現する場合

コマンドの存在有無をPowerShellコマンドレット「Get-Command」で調べる事により、
PowerShell Core環境か・そうでないか判定可能です。

PowerShellで実現する場合
# 'pwsh' コマンドのパスを取得
[System.String]$pwsh_path = (Get-Command 'pwsh' -ErrorAction SilentlyContinue).Source
if ($pwsh_path) {
    # pwsh がある場合(PowerShell Core環境)
    pwsh -NoProfile -ExecutionPolicy Unrestricted -File "ps1ファイルのパスを指定"
} else {
    # pwsh がない場合(PowerShell 5.1環境)
    powershell -NoProfile -ExecutionPolicy Unrestricted -File "ps1ファイルのパスを指定"
}

コマンドプロンプト(バッチ)で実現する方法

上記のPowerShellと同様、コマンドの存在有無を確認(コマンドプロンプトの場合、WHEREコマンドを使用)し、
どちらのPowerShellバージョンで実行すべきか切り分けて実行します。

コマンドプロンプト(バッチ)で実現する方法
@REM pwshコマンドの存在確認
WHERE /Q pwsh
IF %ERRORLEVEL% == 0 (
    @REM pwsh がある場合(PowerShell Core環境)
    pwsh -NoProfile -ExecutionPolicy Unrestricted -File "ps1ファイルのパスを指定"
) ELSE (
    @REM pwsh がない場合(PowerShell 5.1環境)
    powershell -NoProfile -ExecutionPolicy Unrestricted -File "ps1ファイルのパスを指定"
)

まとめ

  • PowerShellでは「 Get-Command 」でpwsh.exeの存在有無により切り替える方法
  • コマンドプロンプト(バッチ)では「 WHERE 」でpwsh.exeの存在有無により切り替える方法

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion