0

我正在使用下面的代码来执行 .bat 文件并读取响应。

java.lang.ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "C:\\main.bat");
    java.lang.Process p = pb.start();            
    String line;
    BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((line = r.readLine()) != null) {
        System.out.println(line); <--this works
    }
    r.close();
}
}

main.bat 只会回显该值

call sample.bat c:\sample.txt value1
echo %value1% <---this works

但是现在我想从 java 代码中传递一个参数,该参数将在批处理文件中设置并且可以在 java 代码中打印。

java.lang.ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "C:\\main.bat" +s1);
java.lang.Process p = pb.start(); 
System.out.println(s1); <--- this does not work

有人可以让我知道如何将 .bat 文件中的值返回到任何调用应用程序吗?

4

5 回答 5

2

请尝试以下代码

步骤 1:创建新类 CommandStreamReader

        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        class CommandStreamReader extends Thread
        {
            InputStream is;
            String type;

            CommandStreamReader(InputStream is, String type)
            {
                this.is = is;
                this.type = type;
            }

            public void run()
            {
                try
                {
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);
                    String line=null;
                    while ( (line = br.readLine()) != null)
                        System.out.println(type + ">" + line);    
                    } catch (IOException ioe)
                      {
                        ioe.printStackTrace();  
                      }
            }
        }

第 2 步:使用您的内容在 C 目录上创建 main.bat 文件,此处为示例

回声桑托什辛德

第 3 步:创建新类 CmdTest

        public class CmdTest { 
            public static void main(String[] args) throws Exception {
            try{
                        String[] cmd = new String[3];
                        cmd[0] = "cmd.exe" ;
                        cmd[1] = "/C" ;
                        cmd[2] = "C:/main.bat";
                        Runtime rt = Runtime.getRuntime();
                        System.out.println("Execing " + cmd[0] + " " + cmd[1]  + " " + cmd[2]);
                        Process proc = rt.exec(cmd);
                        // any error message?
                        CommandStreamReader errorStream = new CommandStreamReader(proc.getErrorStream(), "ERROR");            

                        // any output? Here We take return or output value from bach file
                        CommandStreamReader outputStream = new CommandStreamReader(proc.getInputStream(), "OUTPUT");

                        // kick them off
                        errorStream.start();
                        outputStream.start();

                        // any error???
                        int exitVal = proc.waitFor();
                        System.out.println("ExitValue: " + exitVal);   

                    } catch(Throwable t){
                        t.printStackTrace();
                }  
            }

            }
        }

第 4 步:输出

  Execing cmd.exe /C F:/main.bat
  OUTPUT>
  OUTPUT>C:\Users\Admin\workspace\BuilAPKAnt>echo santosh 
  OUTPUT>santosh shinde
  ExitValue: 0
于 2015-02-12T11:21:51.803 回答
1
exit /B 42 , there is a great batch file resource in http://ss64.com/nt/
于 2013-07-22T20:04:14.133 回答
0

不要将 s1 附加到最后一个参数,而是将其作为第四个参数传递。那应该行得通。

于 2013-07-22T20:06:11.130 回答
0

您是否尝试过仅将变量用作参数,而不是将其连接到 main.bat 调用?

java.lang.ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "C:\\main.bat", s1);

然后在您的批处理文件中,例如:

echo %1
于 2013-07-22T20:06:18.187 回答
0

正如 Mena 所建议的那样,使用您的变量作为参数,然后使用%1可以正常工作注意:您不能在此 fasion 中传递超过 9 个参数%1 - %9

然后将批处理文件中的变量检索到 Java 我相信您可以将%ERRORVALUE% 其用作退出代码

编辑

这有点绕,但您也可以分离 Java,以便在传递参数后批处理文件使用它,然后调用一个单独的 java,传递您希望使用的变量。

于 2013-07-23T08:32:05.467 回答