解決 Windows nvm 出現 Access is denied 或 exit status 145 問題

前言

身為一名 Windows 開發者來講,可能在使用 nvm 時會遇到「nvm use exit status 1: Access is denied」或者是「exit status 145: The directory is not empty.」而這些都算是很常見的狀況,所以稍微紀錄一些解決方式,或許之後自己又會遇到一次。

nvm use exit status 1: Access is denied

首先 「nvm use exit status 1: Access is denied」這個錯誤碼主要是源自於使用者的權限不足,因此不論你使用底下哪一個指令都有可能會發生

1
2
3
4
nvm -v
nvm list
nvm use xxx
...

解決方式其實算是滿簡單的,只需要針對終端機、PowerShell or 命令提示字元點右鍵使用「以系統管理者身份執行」就可以正常使用了

以系統管理者身份執行

永遠以系統管理者身份執行

但是這種狀況來講每次都要使用「以系統管理者身份執行」來開啟終端機是真的滿麻煩的,所以你其實可以針對應用程式永遠「以系統管理者身份執行」,首先點你要永遠執行的程式右鍵選內容

內容

點選下方進階

進階

將「以系統管理員身份執行」打勾

以系統管理員身份執行

最後你只需要按下確定並套用即可,這樣子每次開啟就會以以系統管理員身份開啟了,以下也附上差異圖

系統管理員身份

普通使用者身份

exit status 145: The directory is not empty

exit status 145 這個錯誤稍微比較不好處理,我查了一下大多解法都是描述說目錄安裝下有空格或中文導致,因為預設 Node.js 路徑是這樣子 C:\Program Files\nodejs,而最簡單解法就是重新安裝並自訂目錄就可以解決了,實際上來講我覺得有待測試,因為我的安裝目錄就是 C:\Program Files\nodejs

所以改從別的方向查驗,這邊先試著使用管理者身份檢查 nvm 中的 setting.txt 正確性,只需要看 NVM_HOMENVM_SYMLINK( setting.txt 位於 C:\Users\[username]\AppData\Roaming\nvm 底下) 路徑是否正確,以我的電腦來講就是下方路徑

1
2
root: C:\Users\Hsiangfeng\AppData\Roaming\nvm
path: C:\Program Files\nodejs

後來我在 exit status 145: The directory is not empty , when I run command : nvm use 16.10.0 有人提到

For me the issue was “C:\Program Files (x86)\nodejs” folder was indeed non-empty after uninstalling nodejs.
Deleting that folder than “nvm use ..” worked.

其實這個問題是 Windows 本身的坑,因為在刪除檔案或者移除系統時 Windows 並不會真的移除特定資料夾,也因為這個因素會導致出現 exit status 145 錯誤,因此到 C:\Program Files\ 底下將 nodejs 這個資料夾刪除就可以解決了。

而正常來講 nvm 也會在 C:\Program Files 底下生成一個 node.js 捷徑,請注意是捷徑!如果圖示是這樣的話,那麼就正常

捷徑

你也可以發現捷徑的目錄是指向到 nvm 底下的

nvm

如果你發現圖案是這樣,那麼就必須刪除,因為這不是正確的資料夾

錯誤資料夾

而這個錯誤資料夾也會導致 nvm use 顯示切換成功了,但本質上當你輸入 node -v 卻會出現

node : 無法辨識 ‘node’ 詞彙是否為 Cmdlet、函數、指令檔或可執行程式的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請
確認路徑是否正確,然後再試一次。

因此這也是可以排除的錯誤點之一,這個資料夾也不能透過自己生成捷徑來解決,因為這會有參數設置問題,因此建議「以系統管理者身份執行」來使用 nvm use xxxx 切換版本,當切換 Node 版本時,nvm 就會自己在 C:\Program Files 底下生成一個 node.js 捷徑了。

參考文獻

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你可以也可以請我「喝一杯咖啡(Donate)」。

Buy Me A Coffee Buy Me A Coffee

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ