如何在PowerShell中捕获并处理Java CLI应用程序的错误?
在PowerShell中捕获Java CLI应用的错误并处理
我正在用PowerShell调用Java CLI程序,想捕获Java输出的错误并在PowerShell里处理,用获取Java版本的操作模拟这个需求:
正常场景(有效参数)
使用--version参数时,执行以下命令:
# --version - 输出版本信息后退出 Start-Process -FilePath java -NoNewWindow -ArgumentList '--version' -RedirectStandardOutput ~\Desktop\stdout.txt
生成的stdout.txt内容符合预期:
Get-Content ~\Desktop\stdout.txt openjdk 11.0.3 2019-04-16 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
错误场景(无效参数)
使用无效参数-v时,执行命令:
# -v; 无效参数 Start-Process -FilePath java -NoNewWindow -ArgumentList '-v' -RedirectStandardError ~\Desktop\stderr.txt
stderr.txt生成预期错误内容:
Get-Content ~\Desktop\stderr.txt Unrecognized option: -v Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
问题:try/catch无法触发异常
尝试用try/catch块处理错误,但没有触发异常:
try { # 未抛出异常 Start-Process -FilePath java -NoNewWindow -ArgumentList '-v' -ErrorAction Stop } catch { Write-Host "ERROR: $( $_.Exception.Message )" -ForegroundColor Red }
请问有没有办法实现预期的错误处理效果?
解决方案
方法1:直接调用Java命令(无需Start-Process)
PowerShell中直接执行外部命令时,会自动将其错误流重定向到PowerShell的错误流,配合-ErrorAction Stop就能触发try/catch:
try { java -v 2>&1 -ErrorAction Stop } catch { Write-Host "ERROR: $_" -ForegroundColor Red }
解释:2>&1将Java的*标准错误流(stderr)*合并到标准输出流(stdout),确保错误信息能被PowerShell捕获;-ErrorAction Stop把非终止错误转为终止错误,从而触发catch块。
方法2:用Start-Process获取退出码和错误输出
如果必须用Start-Process,可以通过-Wait等待命令执行完成,然后读取ExitCode判断是否出错,同时捕获错误流:
$processInfo = Start-Process -FilePath java -ArgumentList '-v' -NoNewWindow ` -RedirectStandardError ~\Desktop\stderr.txt -Wait -PassThru if ($processInfo.ExitCode -ne 0) { $errorContent = Get-Content ~\Desktop\stderr.txt -Raw Write-Host "ERROR: $errorContent" -ForegroundColor Red }
解释:
-Wait让PowerShell等待Java进程结束后再继续执行-PassThru返回进程对象,通过ExitCode判断执行结果(Java执行失败时会返回非0退出码)- 提前用
-RedirectStandardError指定错误输出文件,后续读取文件内容处理
方法3:捕获Start-Process的错误流到变量(PowerShell 5.1+)
可以通过临时文件中转错误输出,直接捕获到变量,避免留下冗余文件:
$tempFile = New-TemporaryFile $processInfo = Start-Process -FilePath java -ArgumentList '-v' -NoNewWindow ` -RedirectStandardError $tempFile -Wait -PassThru if ($processInfo.ExitCode -ne 0) { $errorContent = Get-Content $tempFile -Raw Write-Host "ERROR: $errorContent" -ForegroundColor Red } Remove-Item $tempFile -Force
内容的提问来源于stack exchange,提问作者craig
相关产品推荐
相关产品推荐

