👥

VSCodeでpowershell coreをデフォにしたいけど%USERPROFILE%が使えない

2021/05/08に公開

追記: 2021/07/03

"%USERPROFILE%${env:USERPROFILE}に置き換えると普通にいけました。はい。

settings.json
{
  "terminal.integrated.profiles.windows": {
    "pwsh": {
      "path": ["${env:USERPROFILE}\\scoop\\apps\\pwsh\\current\\pwsh.exe"],
      "icon": "terminal-powershell"
    },
  },
}

追記終わり 以下本文


Windows環境のお話です。

VSCodeで"ctrl + shift + @"を押すと新しい統合ターミナルを開けます。
この時開くターミナルの種類は「既定のターミナル」として設定されていますが、コマンドパレット(ctrl + shift + p)から「ターミナル: 既定のプロファイルの選択」を選ぶと既定のターミナルを選択できます。↓

ところがScoopからPowerShell Core(以下、pwsh)を入れた場合は「既定のシェルを選択」の選択肢に出てこないようです。

そういう場合はsettings.jsonterminal.integrated.profiles.windowsという項目を追加し、pwshを追加してやります。
既にterminal.integrated.profiles.windows設定を追加している場合は新規にpwshの項目を追加します。
さらにterminal.integrated.defaultProfile.window設定で既定のプロファイルを指定します。

settings.json
{
  "terminal.integrated.profiles.windows": {
    "pwsh": {
      "path": [
        "C:\\Users\\zenn\\scoop\\apps\\pwsh\\current\\pwsh.exe",
      ],
      "icon": "terminal-powershell"
    },
  },
  "terminal.integrated.defaultProfile.windows": "pwsh"
}

これで既定のプロファイルがpwshになりました。
しかし設定を他のPCと同期している場合、pathのC:\\Users\\zennの部分は他のPC環境では異なる場合があります。そうすると他のPCではpwshが起動してくれません。
そこでC:\\Users\\zennの部分を%USERPROFILE%に置き換えてやります。

settings.json
{
  "terminal.integrated.profiles.windows": {
    "pwsh": {
      "path": [
        "%USERPROFILE%\\scoop\\apps\\pwsh\\current\\pwsh.exe",
      ],
      "icon": "terminal-powershell"
    },
  },
  "terminal.integrated.defaultProfile.windows": "pwsh"
}

これで他のPCでも問題なく起動できるぞ、と思いきやこれは正常に動作しません。

これは以下のIssueによると、

https://github.com/microsoft/vscode/issues/26048

I also think that %USERPROFILE% is resolved to the non-existing path C:\WINDOWS\system32\config\systemprofile in VSCode when it is used in the system variables instead of the user variables is relevant to look at. VSCode simply seems to not take user-variables into account which are supposed to overwrite system variables, and instead falls back to the system defaults.

VSCodeは%USERPROFILE%を”C:\WINDOWS\system32\config\systemprofile”に解決してしまうようです。こまりました。(IssueもCloseされてしまった・・・)

解決策

以下のようにして回避しました。

  1. まずcmdを開く
  2. cmdが起動したらpwshを起動してcmdを閉じる

以下のようにsettings.jsonを修正します。

settings.json
{
  "terminal.integrated.profiles.windows": {
    "pwsh": {
      "path": [
        // cmdをまず起動
        "${env:windir}\\Sysnative\\cmd.exe",
        "${env:windir}\\System32\\cmd.exe"
      ],
      // pwshを起動させる. "/c" をつけることでコマンド実行後にcmdは終了.
      "args": ["/c", "%USERPROFILE%\\scoop\\apps\\pwsh\\current\\pwsh.exe"],
      "icon": "terminal-powershell"
    },
  "terminal.integrated.defaultProfile.windows": "pwsh"
}

この設定をして新しいターミナルを開くとまず「1: cmd」が開き、次に「2: pwsh」が開きます。その後すぐさまcmdが閉じるので、「1: pwsh」に変わるはずです。

Discussion