将.bat文件中的值返回给调用应用程序

时间:2013-07-22 19:51:43

标签: java batch-file

我使用以下代码执行.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文件中的值返回给任何调用应用程序吗?

5 个答案:

答案 0 :(得分: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文件,此处为例

回声santosh shinde

第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

答案 1 :(得分:1)

exit /B 42 , there is a great batch file resource in http://ss64.com/nt/

答案 2 :(得分:0)

不是将s1附加到最后一个参数,而是将其作为第四个参数传递。这应该有用。

答案 3 :(得分:0)

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

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

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

echo %1

答案 4 :(得分:0)

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

中传递超过9个参数

然后从批处理文件中检索变量到Java我相信你可以使用%ERRORVALUE% 作为退出代码

修改

这有点圆,但你也可以将Java分开,以便在传递参数之后 批处理文件使用它然后调用一个单独的java传递你想要使用的变量。