シェル環境のカスタマイズ

PowerShell プロファイルは、PowerShell の開始時に実行されるスクリプトです。 プロファイルを使用して環境をカスタマイズできます。 次の操作を行います。

  • エイリアス、関数、変数の追加
  • モジュールの読み込み
  • PowerShell ドライブの作成
  • 任意のコマンドの実行
  • ユーザー設定の変更

これらの設定をプロファイルに含めると、システムで PowerShell を起動するたびに使用できるようになります。

注意

Windows でスクリプトを実行するには、PowerShell 実行ポリシーを RemoteSigned 以上に設定する必要があります。 実行ポリシーは、macOS と Linux には適用されません。 詳細については、「about_Execution_Policy」を参照してください。

$PROFILE 変数

$PROFILE 自動変数には、現在のセッションで使用できる PowerShell プロファイルへのパスが格納されます。

異なるユーザー スコープと異なる PowerShell ホストをサポートするために使用できるプロファイルは 4 つあります。 各プロファイル スクリプトの完全修飾パスは、次の $PROFILE のメンバー プロパティに格納されます。

  • AllUsersAllHosts
  • AllUsersCurrentHost
  • CurrentUserAllHosts
  • CurrentUserCurrentHost

すべてのユーザーまたは 1 人のユーザー (CurrentUser) に対して実行されるプロファイル スクリプトを作成できます。 CurrentUser プロファイルは、ユーザーのホーム ディレクトリに格納されます。

すべての PowerShell ホストまたは特定のホストに対して実行されるプロファイルもあります。 各 PowerShell ホストのプロファイル スクリプトには、そのホストに対して一意の名前があります。 たとえば、Windows 上の標準コンソール ホストまたは他のプラットフォームの既定のターミナル アプリケーションのファイル名は Microsoft.PowerShell_profile.ps1 です。 Visual Studio Code (VS Code) の場合、ファイル名は Microsoft.VSCode_profile.ps1 です。

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

既定では、$PROFILE 変数を参照すると、"Current User、Current Host" プロファイルへのパスが返されます。 その他のプロファイル パスには、$PROFILE 変数のプロパティを使用してアクセスできます。 次に例を示します。

PS> $PROFILE
C:\Users\user1\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
PS> $PROFILE.AllUsersAllHosts
C:\Program Files\PowerShell\7\profile.ps1

個人用プロファイルを作成する方法

PowerShell をシステムに初めてインストールする場合、プロファイル スクリプト ファイルとそれらが属するディレクトリは存在しません。 次のコマンドを使用すると、"Current User、Current Host" プロファイル スクリプト ファイルが存在しない場合に作成されます。

if (!(Test-Path -Path $PROFILE)) {
  New-Item -ItemType File -Path $PROFILE -Force
}

New-Item コマンドレットの Force パラメーターを使用すると、必要なフォルダーが存在しない場合にそれらが作成されます。 スクリプト ファイルを作成したら、お気に入りのエディターを使用してシェル環境をカスタマイズできます。

プロファイルへのカスタマイズの追加

前の記事では、タブ補完コマンド予測変数エイリアスの使用について説明しました。 これらの記事では、必要なモジュールの読み込み、カスタム補完の作成、キーバインドの定義、およびその他の設定に使用されるコマンドを示しました。 これらは、すべての PowerShell 対話型セッションで使用できるようにするカスタマイズの種類です。 プロファイル スクリプトは、これらの設定用の場所です。

プロファイル スクリプトを編集する最も簡単な方法は、お気に入りのコード エディターでファイルを開く方法です。 たとえば、次のコマンドを実行すると、VS Code でプロファイルが開きます。

code $PROFILE

Windows では notepad.exe、Linux では vi、またはその他のテキスト エディターも使用できます。

次のプロファイル スクリプトには、前の記事で説明したカスタマイズの多くの例があります。 これらの設定は、自分のプロファイルで使用できます。

## Map PSDrives to other registry hives
if (!(Test-Path HKCR:)) {
    $null = New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
    $null = New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS
}

## Customize the prompt
function prompt {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = [Security.Principal.WindowsPrincipal] $identity
    $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator

    $prefix = $(if (Test-Path variable:/PSDebugContext) { '[DBG]: ' }
                elseif ($principal.IsInRole($adminRole)) { "[ADMIN]: " }
                else { '' })
    $body = 'PS ' + $(Get-Location)
    $suffix = $(if ($NestedPromptLevel -ge 1) { '>>' }) + '> '
    $prefix + $body + $suffix
}

## Create $PSStyle if running on a version older than 7.2
## - Add other ANSI color definitions as needed

if ($PSVersionTable.PSVersion.ToString() -lt '7.2.0') {
    # define escape char since "`e" may not be supported
    $esc = [char]0x1b
    $PSStyle = [pscustomobject]@{
        Foreground = @{
            Magenta = "${esc}[35m"
            BrightYellow = "${esc}[93m"
        }
        Background = @{
            BrightBlack = "${esc}[100m"
        }
    }
}

## Set PSReadLine options and keybindings
$PSROptions = @{
    ContinuationPrompt = '  '
    Colors             = @{
        Operator         = $PSStyle.Foreground.Magenta
        Parameter        = $PSStyle.Foreground.Magenta
        Selection        = $PSStyle.Background.BrightBlack
        InLinePrediction = $PSStyle.Foreground.BrightYellow + $PSStyle.Background.BrightBlack
    }
}
Set-PSReadLineOption @PSROptions
Set-PSReadLineKeyHandler -Chord 'Ctrl+f' -Function ForwardWord
Set-PSReadLineKeyHandler -Chord 'Enter' -Function ValidateAndAcceptLine

## Add argument completer for the dotnet CLI tool
$scriptblock = {
    param($wordToComplete, $commandAst, $cursorPosition)
    dotnet complete --position $cursorPosition $commandAst.ToString() |
        ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
}
Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock $scriptblock

このプロファイル スクリプトで、次のカスタマイズの例を示します。

  • もう 1 つのルート レジストリ ハイブ用に 2 つの新しい PSDrives を追加します。
  • 管理者特権のセッションで実行している場合に変更されるカスタマイズされたプロンプトを作成します。
  • PSReadLine を構成し、キーバインドを追加します。 カラー設定では、$PSStyle 機能を使用して ANSI カラー設定を定義します。
  • dotnet CLI ツールのタブ補完を追加します。 このツールには、コマンド ライン引数の解決に役立つパラメーターが用意されています。 Register-ArgumentCompleter のスクリプト ブロックでは、その機能を使用してタブ補完を行います。