在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