PowerShell跑ps1脚本折腾记:执行策略、权限和路径那些坑
整理 Windows 下执行 .ps1 脚本时容易卡住的执行策略、管理员权限、路径处理等实际问题,附常用命令和解决思路。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-09-06 01:16:01 PowerShell Windows运维 脚本编程
刚碰PowerShell的人,大概率都踩过“写好脚本跑不起来”的坑。双击没反应,命令行执行报禁止运行,网上搜答案改了执行策略,又碰权限不足、路径找不到的问题。 其实翻来覆去就是三类问题:执行策略、运行权限、路径规范。摸透之后基本不会再在这上面卡壳。
先说说最基础的,怎么跑一个ps1文件。 别像exe那样直接输文件名,哪怕脚本就在当前目录下也不行,必须加前缀。比如当前文件夹里的MyScript.ps1,得写成.\MyScript.ps1才能执行。用绝对路径也没问题,比如C:\Scripts\MyScript.ps1。 路径带空格的话一定要用引号包起来,不然PowerShell会把空格当成参数分隔符,最后报找不到文件。比如"C:\My Scripts\Install.ps1",这种细节新手很容易忽略。
平时需要频繁跑的脚本,可以做个桌面快捷方式。
目标位置填powershell.exe -File "脚本的完整路径",需要管理员权限的话,去快捷方式属性的高级设置里勾选对应选项,给非技术人员用很方便。
最多人碰到的报错,就是“无法加载文件,因为在此系统上禁止运行脚本”。 这是PowerShell的默认安全机制,默认执行策略是Restricted,几乎不让运行任何脚本,就是为了防止恶意脚本偷偷跑。 修改用Set-ExecutionPolicy命令,普通用户建议只改CurrentUser作用域,不影响系统全局配置。日常用RemoteSigned就够,本地自己写的脚本可以直接运行,从网上下载的脚本需要有数字签名才能执行,安全和便利平衡得比较好。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Unrestricted是全放开,什么脚本都能跑,下载的未签名脚本跑之前会有个确认提示。自己测试环境用用还行,生产环境绝对别这么干,风险太高。
改完之后可以用Get-ExecutionPolicy -List查看各个作用域的生效策略。这里有个坑很多人绕进去:执行策略是有优先级的,MachinePolicy > UserPolicy > Process > CurrentUser > LocalMachine。比如公司域环境下发了组策略限制,你自己改CurrentUser是没用的,优先级不够,改了也不生效。
碰到这种情况就得找域管理员调整策略了。
Get-ExecutionPolicy -List
有些脚本要改系统设置、写Program Files目录、操作注册表,普通用户权限跑不动,会提示需要提升权限。 最直接的办法是右键开始菜单里的PowerShell,选以管理员身份运行。 写脚本的话可以把自检测提权的代码放在开头,脚本运行时自动判断当前身份,不是管理员就自动拉起新的管理员窗口,不用手动右键重启。
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$($MyInvocation.MyCommand.Path)`"" -Verb RunAs
exit
}
想单独确认当前权限,跑这段就行:
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
返回True就是管理员权限,False就是普通用户。
还有一类高频报错,就是说文件不存在。 先核对路径有没有打错,再用Get-Location看一眼当前的工作目录。很多人在资源管理器里按住Shift开PowerShell,目录是对的,但是放到计划任务里跑就炸——计划任务默认的起始目录是System32,相对路径直接失效。这种问题本地测不出来,一上线就出问题,碰到过好多次。 路径里的中文、空格、特殊字符,都有可能出问题,排查的时候优先往这上面想。
写得多了就会有一些固定的好习惯,能少踩很多坑。 重要的脚本尽量做数字签名,不用为了跑脚本把系统策略放得很松,安全性高不少。 线上跑的脚本一定要加日志。Start-Transcript一行命令就能把所有控制台输出写到日志文件里,出问题翻日志定位,比对着黑屏猜原因强太多。
Start-Transcript -Path "C:\Logs\ScriptLog.txt" -Append
Write-Host "脚本执行中..."
Stop-Transcript
逻辑复杂、复用多的代码,拆成psm1模块,用Import-Module加载,比全堆在一个脚本文件里好维护,也方便多个脚本共用。 之前帮运维侧写过一批服务器证书批量续期的脚本,对接的是lcjmSSL的接口。它支持多域名、泛域名还有IP证书,底层对接的是Let's Encrypt、Google Trust Services这些正规CA,自动申请、验证、部署全流程都不用手动管。PowerShell调它的API写个定时任务,配合日志记录,跑了快一年基本没怎么操心,省了很多手动更新证书的重复劳动。
整理 Windows 下执行 .ps1 脚本时容易卡住的执行策略、管理员权限、路径处理等实际问题,附常用命令和解决思路。
记一次虚拟机报错“VMware Authorization Service 无法启动”的排查过程,附脚本和常见坑。
本文系统梳理了跨平台SSL证书有效期查询方案,涵盖OpenSSL、PowerShell和Java环境三大主流工具。通过标准化命令模板和参数说明,解决了远程服务器查询、本地文件解析、特殊格式处理等典型场景问题。特别针对Windows环境和Java应用提供了专用解决方案,并整理了工具对比表格帮助用户快速选择。掌握这些方法可有效避免证书过期导致的服务中断,提升系统运维效率。