GitHub Action运行signtool.exe遭遇ParserError问题求助
问题:GitHub Action中使用signtool签名Windows二进制文件失败
我尝试创建一个使用signtool的GitHub Action工作流(市场上的现有工具都不适用),对应的工作流代码如下:
- name: Sign Windows Binary run: | "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool.exe" sign /a /td sha256 /fd sha256 /v /f "win-cert.p12" /p "${{ secrets.CERTPASSWD }}" /v "RelayKeys setup.exe"
运行后出现解析错误:
ParserError: D:\a\_temp\63b9a5c1-d675-443f-9f82-b82bac3b1007.ps1:2 Line | 2 | … (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool.exe" sign /a /td … | ~~~~ | Unexpected token 'sign' in expression or statement.
之前用同样方式运行其他命令行程序都正常,想知道哪里出问题了?是不是和斜杠转义有关?
解决方案
这个错误是因为GitHub Action的Windows runner默认用PowerShell执行命令,你直接用双引号包裹exe路径后接参数的写法,在PowerShell里会被当成纯字符串处理,不会识别为“执行exe+参数”的指令。有两种简单的修正方式:
方式一:用PowerShell的调用操作符&
在带空格的exe路径前加&,告诉PowerShell这是要执行的可执行文件,后面接参数即可:
- name: Sign Windows Binary run: | & "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool.exe" sign /a /td sha256 /fd sha256 /v /f "win-cert.p12" /p "${{ secrets.CERTPASSWD }}" "RelayKeys setup.exe"
注意:你原来的命令里重复写了/v参数,建议删掉其中一个,避免冗余。
方式二:切换到CMD执行
在步骤里指定用cmd作为shell,这样就能沿用你原来的命令写法:
- name: Sign Windows Binary run: | "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool.exe" sign /a /td sha256 /fd sha256 /v /f "win-cert.p12" /p "${{ secrets.CERTPASSWD }}" "RelayKeys setup.exe" shell: cmd
额外建议
不要硬编码Windows Kits的版本号(比如10.0.17763.0),可以用runner自带的环境变量动态获取路径,避免因runner环境版本更新导致路径失效:
- name: Sign Windows Binary run: | & "$env:WINDOWSSDKDIR\bin\$env:WINDOWSSDKVERSION\x86\signtool.exe" sign /a /td sha256 /fd sha256 /v /f "win-cert.p12" /p "${{ secrets.CERTPASSWD }}" "RelayKeys setup.exe"
内容的提问来源于stack exchange,提问作者willwade
相关产品推荐
相关产品推荐

