PS1 文件怎么运行?PowerShell 脚本执行方法与常见报错解决
经常有人拿着一个 .ps1 文件来问:双击为什么弹出记事本?右键运行为什么闪一下就没了?命令行一敲就报"禁止运行脚本"?这三个问题其实都不是脚本本身的问题——是运行方式不对。
这篇不讲原理,只给实际能用的命令:先把执行策略这个拦路虎解决掉,再给五种运行方式和定时运行配置,最后附一张常见报错速查表。照着敲就能跑通。
一、先解决"禁止运行脚本":执行策略(ExecutionPolicy)
Windows 默认策略是 Restricted,任何 .ps1 都不让跑,报错长这样:
无法加载文件 C:\scripts\test.ps1,因为在此系统上禁止运行脚本。有关详细信息。
按需三选一(推荐第 2 种):
# 1. 只对当前这一个窗口生效,关掉就恢复,最安全
Set-ExecutionPolicy Bypass -Scope Process -Force
# 2. 只给当前用户放开"本地脚本随便跑、下载的要签名",一次设置长期有效
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
# 3. 不改策略,运行时临时绕过(跑别人的脚本最常用)
powershell.exe -ExecutionPolicy Bypass -File "C:\scripts\test.ps1"
各策略的含义,一张表说清:
| 策略 | 本地脚本 | 网络下载脚本 | 适用场景 |
| Restricted(默认) | 禁止 | 禁止 | 只跑单条命令的环境 |
| RemoteSigned | 允许 | 需数字签名 | 个人电脑 / 服务器日常,推荐 |
| AllSigned | 需签名 | 需签名 | 安全要求严格的企业环境 |
| Bypass | 允许 | 允许 | 仅建议单次运行时用(-Scope Process) |
查看当前策略用 Get-ExecutionPolicy -List,生效优先级从高到低:MachinePolicy > UserPolicy > Process > CurrentUser > LocalMachine。如果 MachinePolicy / UserPolicy 是 AllSigned 或 Restricted,那是组策略下发的,Set-ExecutionPolicy 改不动,得找域管理员。

二、五种实际可用的运行方式
方式 1:命令行 -File 运行(最推荐)
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\scripts\backup.ps1" -Days 7
三个参数值得记住:-NoProfile 跳过个人配置文件(启动更快、环境更干净);-ExecutionPolicy Bypass 不受本机策略限制;脚本自己的参数(如 -Days 7)直接跟在后面空格传。写进计划任务、批处理、文档教程,都用这一种。
方式 2:右键"使用 PowerShell 运行"
.ps1 文件右键就有这个菜单,适合无参数的小脚本。两个先天缺陷:不能传参数;跑完窗口立即关闭,出错都来不及看。想看结果,在脚本最后一行加 Read-Host "按回车退出",或者改用方式 1。
方式 3:在 PowerShell 会话里用 & 调用
# 路径带空格必须加 & 调用符
& "C:\My Scripts\test.ps1"
# 当前目录下的脚本要带 .\ 前缀
.\test.ps1
# 点源(dot-source):脚本里的变量和函数留在当前会话,写工具库时用
. .\common-functions.ps1
方式 4:PowerShell 7 运行(pwsh)
pwsh -NoProfile -File "C:\scripts\test.ps1"
Windows 自带的 powershell.exe 是 5.1,装了 PowerShell 7 后命令是 pwsh。同一脚本两边行为可能不同——脚本针对哪个版本写的,就用哪个解释器跑,文件开头加上 #Requires -Version 7 可以强制版本检查。
方式 5:不落地直接跑一段命令
powershell.exe -NoProfile -Command "Get-Service | Where-Object {$_.Status -eq 'Stopped'}"
适合批处理里嵌一行 PowerShell、或远程执行的场景。多行逻辑建议还是落成 .ps1 文件,可读性和可维护性完全不是一个量级。
三、网上下载的脚本跑不了:先解锁(Unblock-File)
从浏览器、IM 下载的 .ps1 会带"网络标记"(Zone.Identifier),策略是 RemoteSigned 时照样被拦。先解锁再运行:
# 查看文件是否带标记
Get-Item .\test.ps1 -Stream Zone.Identifier
# 解锁单个文件(确认过内容之后)
Unblock-File .\test.ps1
# 解锁整个目录
Get-ChildItem C:\scripts -Recurse | Unblock-File
四、需要管理员权限时怎么跑
# 从当前窗口弹一个管理员窗口运行
Start-Process powershell -Verb RunAs -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File "C:\scripts\admin-task.ps1"'
也可以在脚本开头加一行 #Requires -RunAsAdministrator,权限不够时直接拒绝执行,比脚本跑到一半失败强得多。批处理里需要弹 UAC 时,用上面的 Start-Process -Verb RunAs。
五、定时自动运行:挂进计划任务
计划任务里不要直接填 .ps1 文件路径(默认动作不是用 PowerShell 解释它),正确填法:
| 字段 | 填写内容 |
| 程序或脚本 | powershell.exe |
| 添加参数 | -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\scripts\daily.ps1" |
| 起始于 | C:\scripts\ |
三个要点:策略已经在参数里绕过了,本机策略不用动;-WindowStyle Hidden 不弹黑窗;排查任务为什么没跑时,先看任务历史记录,再手动执行同样的命令行验证。
六、常见报错速查表
| 现象 | 原因 | 处理 |
| 在此系统上禁止运行脚本 | 执行策略拦截 | 见第一节,推荐 -Scope CurrentUser RemoteSigned |
| 无法将"test.ps1"识别为 cmdlet | 当前目录脚本没带 .\,或路径不对 | 用 .\test.ps1 或绝对路径 + & 调用 |
| 项无法识别…因为名称包含无效字符 | 路径带空格没加调用符 | & "C:\My Scripts\a.ps1" |
| 脚本里的中文显示乱码 | 文件编码不对 | 另存为 UTF-8 with BOM(VS Code 右下角可改) |
| 某模块加载不到 / 驱动行为异常 | 32 位解释器跑的 | 确认用的是 System32\WindowsPowerShell 下的 64 位版本 |
| 双击 / 右键运行窗口一闪而过 | 跑完立即退出 | 命令行加 -NoExit,或脚本末尾加 Read-Host |
| 策略改了仍然报禁止 | 组策略优先级更高 | 用 Get-ExecutionPolicy -List 看顶层来源,联系域管理员 |
七、两条安全提醒
Bypass 只做单次使用,别写进全局策略或长期留在计划任务参数里"图省事";日常环境设
RemoteSigned -Scope CurrentUser就够了。运行别人的脚本之前,先打开看一遍内容——
notepad .\test.ps1三十秒能看完的检查,省掉的是整个环境被清空的代价。来源不明的脚本,再急也不要Bypass硬跑。
PowerShell 中文社区团队承接企业底层 IT 基础设施技术服务:AD 域控建设迁移与故障处置、Exchange 邮件系统运维、VMware / Citrix 虚拟化、国产分布式存储故障定位、NVIDIA B300 / H100 / H200 算力服务器整机验收与压力测试,以及 PowerShell 自动化脚本定制(批量巡检、日志分析、报表生成、跨系统联动)与运维实战培训。
创始人:邓鹏|PowerShell 中文社区创始人,51CTO 认证讲师(2021 年度十大新锐讲师),西安交通大学计算机专业。长期从事企业级身份管理、虚拟化与自动化运维交付。
报价:脚本定制与培训按需求范围评估,价格另议;技术服务不含硬件设备采购。
联系方式:邮箱 dengpeng@powershell.com.cn | 官网 www.powershell.com.cn
服务流程:需求沟通 → 可行性评估 → 方案确认 → 报价确认 → 开发实施 → 验收交付。生产环境变更类脚本,一律先在测试环境验证、确认回滚方案后上线。
本文示例均在 Windows PowerShell 5.1 与 PowerShell 7 环境验证;执行策略以企业安全基线为准,本文方法不应绕过合规要求。
扫描二维码推送至手机访问
版权声明:本文由 PowerShell 中文社区发布,如需转载请注明出处。
联系咨询:邮箱 dengpeng@powershell.com.cn | 电话/微信 176-6506-6665





