Windows CMD执行Maven命令可正常获取输出,但GitHub Actions中PowerShell执行相同命令失败
Windows CMD执行Maven命令可正常获取输出,但GitHub Actions中PowerShell执行相同命令失败
看起来你在本地Windows CMD里跑这条Maven命令完全没问题,能顺利拿到super-portal的输出,但放到GitHub Actions的PowerShell步骤里就卡壳了对吧?先帮你理清楚问题出在哪,再给你调整后的可行方案。
先回顾下你本地CMD能正常跑的命令:
D:\Git-Runners\apache-maven-3.8.1\bin\mvn -f "D:\Git-Runners\myrepo\pom.xml" help:evaluate -Dexpression=project.artifactId -q -DforceStdout
输出确实是super-portal,这说明命令本身逻辑是对的,问题出在PowerShell里的命令拼接和执行方式上。
你当前的PowerShell脚本里把命令拼成字符串再执行的写法,很容易因为引号转义的问题导致解析错误,给你调整成PowerShell里更稳妥的标准写法:
PRE_RELEASE: runs-on: "selfhosted-windows" steps: - name: Release to DEV shell: powershell run: | $newmvnhome = "D:\Git-Runners\apache-maven-3.8.1" $repopath = "D:\Git-Runners\myrepo" # 直接调用mvn命令,避免字符串拼接的引号转义坑 $ARTIFACTID = & "$newmvnhome\bin\mvn" -f "$repopath\pom.xml" help:evaluate -Dexpression=project.artifactId -q -DforceStdout # 输出结果验证 Write-Output "获取到的Artifact ID是: $ARTIFACTID"
为什么这么改更靠谱?
- PowerShell里用
&调用外部可执行文件是标准操作,能避开字符串拼接时的引号解析混乱 - 直接拆分传递参数,PowerShell会自动处理路径中的空格,不需要额外手动转义引号
- 命令的输出可以直接赋值给变量,后续你能直接用这个变量做其他操作
要是你实在想保留字符串拼接的方式(不推荐,容易踩坑),得把转义写对,比如:
$ARTIFACTCMD = "$newmvnhome\bin\mvn -f `"$repopath\pom.xml`" help:evaluate -Dexpression=project.artifactId -q -DforceStdout" # 用Invoke-Expression执行拼接后的命令 $ARTIFACTID = Invoke-Expression $ARTIFACTCMD
但还是建议用第一种直接调用的方式,稳定性和可维护性都更高。
你试试调整后的脚本,应该就能像本地CMD一样拿到正确的输出了。
备注:内容来源于stack exchange,提问作者Ashar




