【发布时间】:2021-02-04 11:30:26
【问题描述】:
我有一个 batfile 可以在远程服务器上运行一个 tomcat 实例。 batfile 包含 Session ID 的变量,如下所示。
cmdkey.exe /add:Server /user:Server\Username /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:\Users\Username\Desktop\CMDTest" 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);
}
}
【问题讨论】:
-
可能找不到
psexec(工作文件夹可能不是您所期望的)。给它一个完全限定的文件名 ("drive:\path to\psexec.exe") -
也不要定义环境变量,直接使用返回的
for变量即可。例如:For /F "Tokens=2-3" %%G In ('P:\ath\To\psexec.exe -nobanner \\Server query session 2^> NUL') Do If /I "%%G" == "UsersName" P:\ath\To\psexec.exe -accepteula -s -i %%H \\Server -w "%SystemDrive%\Users\UsersName\Desktop\CMDTest" cmd.exe /C "Start "CMDTest" /I RunCatalina.bat".
标签: java batch-file cmd processbuilder