You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java调用WinRM启动远程Windows的Spring Boot进程并获取PID

解决方案

根本原因

远程PowerShell基于WinRM协议实现,会话默认会等待所有关联子进程的IO流句柄全部关闭后,才会终止并返回执行结果。你启动的Spring Boot Java进程会长期持有输出/错误重定向文件的句柄,因此会话会一直挂起直到Java进程退出,和你使用的远程调用库无关。


方案1:优化Start-Process命令

调整命令逻辑,拿到PID后主动终止会话,同时避免进程持有会话关联的句柄:

$proc = Start-Process -FilePath java -ArgumentList @('-jar', 'C:\xxx.jar') -PassThru -NoNewWindow -RedirectStandardOutput 'C:\temp\console.out' -RedirectStandardError 'C:\temp\console.err' -WindowStyle Hidden
Write-Output $proc.Id
Exit-PSSession

方案2:使用WMI创建进程(更稳定,推荐)

WMI创建的进程完全独立于当前PowerShell会话,不存在IO句柄绑定问题,调用后会立刻返回PID,不会出现会话挂起:

$createResult = ([wmiclass]'\\.\root\cimv2:Win32_Process').Create("java -jar C:\xxx.jar", "C:\jar工作目录路径", $null)
$createResult.ProcessId

第二个参数为Java进程的工作目录,可根据你的实际需求调整,不需要的话填$null即可。


注意事项

  • 所有文件路径优先使用绝对路径,避免远程会话默认工作目录异常导致的权限报错、文件找不到问题
  • 如果启动jar需要附加端口、配置文件等参数,直接拼接在命令字符串或者ArgumentList数组中即可
  • 确保远程连接使用的账号,拥有jar文件读取权限、日志输出目录写入权限、进程创建权限

内容的提问来源于stack exchange,提问作者Jeremy Power

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:09:01