【问题标题】:Variables defined in batfile are displayed as blank when batfile is run using java processbuilder使用java processbuilder运行bat文件时,bat文件中定义的变量显示为空白
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 2014-10-12
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多