在使用java processbuilder运行batfile时,在batfile中定义的变量显示为空白



我有一个用于在远程服务器上运行tomcat实例的batfile。batfile包含一个Session ID变量,如下所示:

cmdkey.exe /add:Server /user:ServerUsername /pass:Password
FOR /F "tokens=3 delims= " %%I IN ('psexec -nobanner \Server query session ^| findstr "Username"') DO set ID=%%I
echo %ID%
PsExec.exe -accepteula -s -i %ID% \Server -w "C:UsersUsernameDesktopCMDTest" cmd /c "start /i "CMDTest" RunCatalina.bat"
cmdkey.exe /delete:Server

独立运行时,batfile按预期执行。但是,当我使用java processbuilder运行它时,变量ID作为空白传递。

ProcessBuilder代码:

public static void runBatFileOutput(String batName,String Path) throws Throwable {
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", batName);
File dir = new File(Path);
pb.directory(dir);
Process p = pb.start();
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}

我能够解决这个问题。我们在同一台服务器上运行了多个tomcat,因此,主目录读取不正确,因此,要么不启动tomcat,要么启动另一个tomcat。解决方案是在不同的服务器上使用单独的batfile来运行启动bat,并根据当前tomcat实例的需要设置env变量。在这种情况下,变量将特定于当前cmd会话,并且不会覆盖系统变量。