如何在PowerShell中识别调用的Gradle构建是否失败
如何正确识别Gradle构建失败的情况
你的脚本无法识别Gradle构建失败,核心原因是**dev.bat没有传递Gradle的退出码**,导致cmd.exe始终返回0(成功),即使Gradle构建失败。以下是几种可行的解决方案:
方案1:修改dev.bat传递Gradle退出码
编辑dev.bat文件,在Gradle命令执行后添加exit /b %errorlevel%,确保批处理文件返回Gradle的真实退出码:
@echo off :: 保留原有的dev.bat命令 gradlew clean build :: 传递Gradle的退出码给cmd.exe exit /b %errorlevel%
修改后,Start-Process获取的ExitCode会正确反映Gradle的构建结果,你的原有判断逻辑就能正常工作。
方案2:直接调用Gradle wrapper跳过cmd和批处理
绕过cmd.exe和dev.bat,直接在PowerShell中调用Gradle wrapper脚本,这样可以直接获取Gradle进程的退出码,避免中间层的问题:
$gradlewPath = Join-Path -Path $currentProject -ChildPath "gradlew.bat" $proc = Start-Process -FilePath $gradlewPath -ArgumentList "clean build" -Wait -PassThru -NoNewWindow if ($proc.ExitCode -eq 0) { Write-Host "SUCCESS -->[$currentProject]" } else { Write-Error "BUILD-ERROR --> $currentProject please fix it first" Write-Host "call this manually: $gradlewPath clean build" break }
-NoNewWindow参数会让Gradle的输出直接显示在PowerShell窗口中,方便调试。
方案3:捕获输出并检测"BUILD FAILED"(备选方案)
如果无法修改dev.bat或直接调用Gradle,可以通过捕获构建输出,检查是否包含BUILD FAILED字符串来判断失败:
# 创建临时文件存储输出 $tempOut = [System.IO.Path]::GetTempFileName() $tempErr = [System.IO.Path]::GetTempFileName() $proc = Start-Process -FilePath 'C:\Windows\System32\cmd.exe' -ArgumentList '/c', "$currentProject\dev.bat clean build" -Wait -PassThru -RedirectStandardOutput $tempOut -RedirectStandardError $tempErr # 读取输出内容 $output = Get-Content $tempOut -Raw $errorOutput = Get-Content $tempErr -Raw # 清理临时文件 Remove-Item $tempOut, $tempErr -Force # 同时检查退出码和输出内容 if ($proc.ExitCode -eq 0 -and $output -notmatch "BUILD FAILED") { Write-Host "SUCCESS -->[$currentProject]" } else { Write-Error "BUILD-ERROR --> $currentProject please fix it first" Write-Host "call this manually: $currentProject\dev.bat clean build" # 可选:打印捕获的输出信息 Write-Host "构建输出:`n$output`n错误输出:`n$errorOutput" break }
内容的提问来源于stack exchange,提问作者Al Phaba
相关产品推荐
相关产品推荐

