この記事について
Windows で mise を使って「フォルダを移動するだけで Node.js のバージョンが自動で切り替わる」状態を作るまでの手順を、実際に詰まったポイントも含めてまとめます。
mise use node@18 でバージョンを設定したのに node -v が変わらない、という症状に遭遇した人向けです。結論から言うと、Windows PowerShell 5.1 では mise の自動切り替え(cd 時のフック)が効かず、PowerShell 7 系が必要です。この記事ではその PowerShell 7 の導入から、実際に切り替わるところまでを通しで解説します。
前提の確認
まず自分の PowerShell のバージョンを確認します。
$PSVersionTable.PSVersion
Major が 5 なら Windows PowerShell 5.1 で、mise の cd 時自動切り替えは効きません。この記事の手順で PowerShell 7 を導入してください。Major が 7 なら、STEP 2 から進めて構いません。
なぜ PowerShell 7 が必要なのか(背景)
mise use node@18 を実行すると mise.toml に node = "18" と記録されますが、それを読んで実際に PATH を書き換えるのは「有効化(mise activate)」で仕込むフック関数の仕事です。
この「cd に反応してバージョンを切り替える機能(chpwd フック)」は、mise の実装上 System.Management.Automation.LocationChangedEventArgs などの C# API を使っており、PowerShell 7.2 以上が必要です。Windows に標準搭載の 5.1 では動きません。
そのため、5.1 のままだと「設定は書けているのに node -v が変わらない」という状態になります。
なお PowerShell 7 は 5.1 を上書きしません。実行ファイル名(
powershellとpwsh)もプロファイルの場所も別で、両者は共存します。5.1 が消えることはないので安心して導入できます。
STEP 1: PowerShell 7 のインストール
⚠️ この操作の副作用
以下のインストールは、Microsoft の配布元から PowerShell 7 のインストーラをネットワーク経由でダウンロードし、システムにインストールします。ローカル設定の変更だけでは完結しません。5.1 はそのまま残り、7 が別途追加されます。
winget を使う方法(おすすめ)
現在の PowerShell 5.1 または cmd で、次を実行します。
winget install --id Microsoft.PowerShell --source winget
winget が使えるかどうかは winget --version で確認できます。使えない場合は Microsoft Store で「PowerShell」を検索してインストールするか、GitHub の公式リリースページ(github.com/PowerShell/PowerShell)から .msi インストーラを取得してください。
インストール後、PowerShell 7 を起動する
7 の実行ファイル名は pwsh です(5.1 は powershell)。起動方法は次のいずれか。
- スタートメニューで「PowerShell 7」を検索して起動
-
Win + R→「ファイル名を指定して実行」でpwshと入力 - 既存のシェルや Windows Terminal から
pwshと入力
起動したら、必ずバージョンを確認します。
$PSVersionTable.PSVersion
Major Minor Patch
----- ----- -----
7 6 3
Major が 7 になっていれば成功です。以降の手順は、この PowerShell 7(pwsh)のウィンドウで実行してください。 5.1 で実行すると設定が効きません。
STEP 2: 7 のプロファイルに有効化を書く
PowerShell 7 のプロファイル($PROFILE)は 5.1 とは別ファイルです。ここに mise の有効化コマンドを書くことで、pwsh を起動するたびに自動で有効化されるようになります。
プロファイルの場所を確認
$PROFILE
C:\Users\<ユーザー名>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
7 は PowerShell フォルダ、5.1 は WindowsPowerShell フォルダと、名前が異なります。
プロファイルが存在するか確認
Test-Path $PROFILE
False が返った場合は、まだプロファイルファイルが存在しないので、次で作成します(-Force で親ディレクトリごと作成)。
New-Item -Path $PROFILE -ItemType File -Force
💡 補足:
New-ItemをNew-CimInstanceなどと打ち間違えないよう注意。正しいコマンドはNew-Itemです。
有効化の一行を追記
'(&mise activate pwsh) | Out-String | Invoke-Expression' | Add-Content $PROFILE
⚠️ 副作用:この操作はプロファイルファイルへの書き込みを伴います(ネットワークアクセスはありません)。既存のプロファイルがある場合は末尾に追記されます。心配なら事前に
Get-Content $PROFILEで中身を確認してください。
このとき追記される一行の意味は次の通りです。
| 部分 | 役割 |
|---|---|
&mise activate pwsh |
mise が PowerShell 用の有効化スクリプト(文字列)を出力する |
Out-String |
複数行の出力を 1 つの文字列に結合する |
Invoke-Expression |
その文字列を PowerShell コードとして実行する(eval 相当) |
STEP 3: プロファイルを読み込む
追記しただけでは今のセッションにはまだ反映されていません。pwsh を開き直すか、その場で読み込みます。
. $PROFILE
先頭の「ドット + スペース」を忘れずに。これが「プロファイルを今すぐ実行する」書き方です。
STEP 4: 動作確認
mise use node@18 を設定済みのフォルダに移動して、バージョンを確認します。
cd G:\playground\recoil-app
node -v
v18.20.8
v18.20.8 のように、mise.toml で指定したバージョンが返れば成功です 🎉
cd した瞬間に mise が mise.toml を読み取り、PATH を書き換えて指定バージョンの Node を使わせてくれています。別のフォルダに移動して戻ってくると、フォルダに応じて自動でバージョンが切り替わることも確認できます。
うまくいかないときの切り分け
node -v がまだ以前のバージョン(例:v24.x.x)のままの場合、次の順で確認します。
1. 本当に PowerShell 7 で開いているか
$PSVersionTable.PSVersion # Major が 7 か
2. node がどの実体を指しているか
Get-Command node | Select-Object -ExpandProperty Source
...\mise\installs\node\... のような mise 配下のパスになっていれば有効化が効いています。C:\Program Files\nodejs\node.exe のようなシステムのパスなら、有効化が効いていません(7 で開き直す、STEP 3 の再読み込みを行う、などを確認)。
3. mise の診断を使う
mise doctor
mise 自身が設定の問題を診断してくれます。
4. 設定自体が正しいかを確認(有効化に依存しない方法)
mise exec -- node -v
これで指定バージョンが返れば「mise.toml の設定は正しい、あとは有効化の経路の問題」と切り分けられます。
まとめ
- Windows 標準の PowerShell 5.1 では mise の
cd時自動切り替えが効かない。PowerShell 7 系(7.2 以上)が必要。 - PowerShell 7 は 5.1 と共存する(上書きしない)。導入は
winget install --id Microsoft.PowerShellが手軽(ネットワーク・インストールの副作用あり)。 - 7 の
$PROFILE(5.1 とは別ファイル)に(&mise activate pwsh) | Out-String | Invoke-Expressionを追記する。 -
. $PROFILEで読み込み、対象フォルダでnode -vが指定バージョンになれば成功。
これで、プロジェクトごとに mise use でバージョンを紐づけておけば、フォルダを移動するだけで自動的に正しい Node バージョンが使われる、快適な環境が完成します。