环境说明:在windows系统上通过VSCode编辑Vue项目,想要直接在VSCode的终端(PowerShell)中执行npm run dev 命令运行项目,结果终端显示错误信息:
npm : 无法加载文件 C:\Program Files\nodejs\node-v22.4.0-win-x64\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/
?LinkID=135170 中的 about_Execution_Policies。
尝试在终端中执行其他的npm命令也失败。打开cmd窗口执行以上npm命令正常。
错误原因
根据错误信息中的关键——因为在此系统上禁止运行脚本,可知应该是VSCode中打开的PowerShell终端不能运行脚本。打开错误信息中的网址https:/go.microsoft.com/fwlink/?LinkID=135170,阅读有关about_Execution_Policies的信息可以了解到是Windows系统中设置了一些脚本执行策略来保护电脑安全。
在默认情况下,windows系统的PowerShell的执行策略为Restricted。
这里需要了解一下PowerShell的执行策略:
RESTRICTED:默认执行策略,允许单独的命令,但不会运行脚本。阻止所有脚本文件的运行,包括格式设置文件和配置文件 (.ps1xml)、模块脚本文件 (.psm1) 和 Windows PowerShell 配置文件 (.ps1)。ALLSIGNED:脚本可以运行,但要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。会在运行来自某类发布者(即你尚未归类为受信任或不受信任的发布者)的脚本之前提示你。即使是这样,依旧可能存在运行已签名但却是恶意的脚本的风险。REMOTESIGNED:脚本可以运行,要求从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序)具有受信任的发布者的数字签名,但不要求在本地计算机上编写的脚本(不是从 Internet 下载的)具有数字签名。如果脚本已被取消阻止(比如通过使用 Unblock-File cmdlet),则运行从 Internet 下载但未签名的脚本。存在运行来自 Internet 源的未签名脚本和已签名但却是恶意的脚本的风险。UNRESTRICTED:未签名的脚本可以运行(这存在运行恶意脚本的风险)。Windows系统在运行从 Internet 下载的脚本和配置文件之前提醒用户。BYPASS:不阻止任何内容,并且没有任何警告或提示。该执行策略旨在用于配置:在其中 Windows PowerShell 被内置于一个更大的应用程序中,或者在其中 Windows PowerShell 是具有其自己安全模式的程序的基础。UNDEFINED:当前作用域中未设置执行策略。如果所有作用域中的执行策略都是 Undefined,则有效的执行策略是 Restricted,它是默认执行策略。
在PowerShell终端中执行Get-ExecutionPolicy命令可以获取当前执行策略,我的计算机上是Restricted。也可以执行Get-ExecutionPolicy -List命令获取影响当前会话的所有执行策略,并按优先顺序显示它们,我的计算机上显示如下:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
如同上面说到的——如果所有作用域中的执行策略都是 Undefined,则有效的执行策略是 Restricted,它是默认执行策略。这里也可以发现作用域(Scope)的优先级(从高到低):MachinePolicy、UserPolicy、Process、CurrentUser、LocalMachine。优先的策略在当前会话中有效,即使在较低优先级上设置了更加严格的策略。
接着需要了解作用域:Scope 的有效值为 Process、CurrentUser 和 LocalMachine。设置执行策略时,LocalMachine 是默认值。
PROCESS:执行策略仅影响当前会话(当前 Windows PowerShell 进程)。执行策略存储在 $env:PSExecutionPolicyPreference 环境变量中,不是存储在注册表中,并且当关闭会话时会删除它。不能通过编辑变量值来更改策略。CURRENTUSER:执行策略仅影响当前用户。它存储在 HKEY_CURRENT_USER 注册表子项中。LOCALMACHINE:执行策略会影响当前计算机上的所有用户。它存储在 HKEY_LOCAL_MACHINE 注册表子项中。
问题解决——更改PowerShell执行策略
要更改Windows PowerShell 执行策略,需要使用 Set-ExecutionPolicy 命令。
命令格式:
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
参数-ExecutionPolicy:设置执行策略;
参数-Scope:设置作用域。若不带这个参数,则更改LOCALMACHINE(本地计算机)的执行策略。
更改会立即生效,无需重新启动 Windows PowerShell。
这里我根据自己计算机的使用和安全考虑,执行策略选择REMOTESIGNED,作用域选择LOCALMACHINE,完整更改命令:Set-ExecutionPolicy -ExecutionPolicy REMOTESIGNED。
注意:若要运行更改本地计算机(默认)的执行策略的命令,请使用“以管理员身份运行”选项启动 Windows PowerShell。
设置完成后,我在VSCode的终端中输入npm命令正常运行。
再提醒一下:请根据自己计算机的执行策略情况进行设置,可能计算机已经有一些存在的执行策略(Get-ExecutionPolicy -List命令可以查看),且优先级较高,当我们更改后,我们的更改不一定生效,此时可以尝试删除已有的执行策略。
若要删除某个特定作用域的执行策略,则将执行策略的值设置为 Undefined。