PowerShell 脚本跑不起来提示禁止运行:执行策略不是安全软件,Process 作用域放行才对路
不少人第一次撞上这堵墙是在装开发工具的时候:用 npm 装了个前端脚手架,在 PowerShell 里敲命令,结果满屏红字——无法加载文件 xx.ps1,因为在此系统上禁止运行脚本。第一反应多半是「中病毒了?被杀毒软件拦了?」,跑去翻杀软设置、关防火墙,折腾半天红字依旧。其实这跟杀毒软件半点关系没有,拦你的是 PowerShell 自己的一道关卡:执行策略。
先把误会解开。微软官方对执行策略的定位很直白:不是安全边界,不是杀毒机制,作用是防止你无意间运行来路不明的脚本——本质是道「你确定要跑脚本吗」的确认门。系统默认策略是 Restricted,禁止运行任何 .ps1 脚本文件(交互式敲命令不受影响,所以平时感觉不到它的存在)。
为什么装个前端工具会撞上?因为 npm 装的很多全局命令,入口就是 ps1 脚本。你敲 ng version,实际是让 PowerShell 去执行 ng.ps1 这个文件,一脚踩在「禁止运行脚本」的门槛上,红字就来了。
接下来按顺序处理,别用错方法。
- 先看当前策略。执行 Get-ExecutionPolicy,返回 Restricted 就印证了判断;想看得更全,用 Get-ExecutionPolicy -List 把各作用域一次列出来。
- 分清四个作用域。执行策略按优先级从高到低分几层:组策略定的(机器和用户,个人改不动)、Process(只对当前窗口生效)、CurrentUser(当前用户)、LocalMachine(整机)。改了没生效,多半是被更高优先级的作用域压住了。
- 临时放行,处理一次性任务。执行 Set-ExecutionPolicy -Scope Process Bypass,只对当前窗口生效,窗口一关策略恢复原样。跑一次构建、执行一次安装脚本,用完即走,不给系统留口子。
- 开发机长期需要,再放宽到用户级。Set-ExecutionPolicy -Scope CurrentUser RemoteSigned——本地自己写的脚本可以直接跑,从网上下载的脚本必须有数字签名才能执行,这个档位兼顾方便和谨慎,而且只动当前用户不碰整机。
- 验证。再执行一次 Get-ExecutionPolicy 确认变化,重跑刚才报错的命令;若仍不生效,回第 2 步查作用域优先级。
有个错误动作要提醒:一上来就用管理员权限把整机策略改成不限制,等于把全楼的「确认门」都拆了,公司电脑上这么干迟早被 IT 部门找上门。这事跟权限大小没关系,别往提权方向想——门就在那里,拿对钥匙就行。贵州诚鑫致达科技给客户写 Windows 自动化脚本时立了个习惯:临时任务一律用 Process 作用域,长期驻留的脚本才配 RemoteSigned,钥匙和门永远配套。你当年是被哪个命令的红字拦住的?评论区报个到。