在Windows系統裡,PowerShell支援比傳統CMD命令列更豐富的命令和模組。然而,開發者可能會遇到PowerShell無法執行指令的問題,以下是我的經驗。
問題
我有個使用NPM管理的開發專案。為了升級這個專案的依賴套件版本,我在PowerShell裡定位到該專案路徑,執行npm-check-updates
指令。然而,PowerShell傳回了錯誤訊息,提示“無法載入文件,因為在此系統上禁止執行腳本。”
起初我以為是軟體環境配置不當。但之後我確認npm-check-updates
以全域形式正確安裝,並且已在系統的環境變數中添加了它的路徑。我嘗試使用命令提示字元執行同樣的命令,居然能正常運作!然而,我不想放棄PowerShell運行命令的便利性。
根據錯誤提示訊息,我找到了處理辦法。
解決方法
在PowerShell執行這條指令:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
該指令立即生效,然後就可以在PowerShell正常執行NPM的各種全域指令。
解釋
是PowerShell的執行原則阻止了命令執行。
PowerShell的執行原則是一項安全功能,可控制載入組態檔和執行腳本的條件。此功能有助於防止執行惡意指令碼。
這裡可以查看有關PowerShell執行原則的詳細資料。
可透過以下命令,取得目前有效的執行原則:
Get-ExecutionPolicy
Windows客戶端系統的預設執行原則是Restricted
,意味著防止執行所有腳本檔案,包括格式化和組態檔(.ps1xml)、模組腳本檔案(.psm1)和PowerShell配置檔(.ps1)。所以,NPM套件的全域指令就被PowerShell阻止執行。
如果要對指定的作用域設定執行原則,執行下列命令:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
其中,<PolicyName>
和<scope>
要替換為對應的值,可在上面連結的詳細資料中查詢。
前面的解決方法裡的那個指令,意思是對目前使用者應用RemoteSigned
策略。這是一種以較小權限取得資格來執行腳本的方法。
如果要刪除目前使用者的執行原則,恢復系統預設狀態,可執行以下命令:
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser