Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java程序运行批处理文件,然后运行exe文件_Java_Process_Batch File - Fatal编程技术网

从Java程序运行批处理文件,然后运行exe文件

从Java程序运行批处理文件,然后运行exe文件,java,process,batch-file,Java,Process,Batch File,我需要从java程序调用两个文件: 设置环境的批处理文件 exe文件 为了运行exe,我需要设置一些环境变量,这是通过批处理文件完成的 set MSDEV_HOME=C:\Program Files\Microsoft Visual Studio 8\VC set FOO_ROOT=D:\UGS\Support_Dev\2005SR1 set FOO_DATA=X: call %FOO_DATA%\FOO_profilevars set FOO_BIN=B: set FOO_LIB=L: set

我需要从java程序调用两个文件:

  • 设置环境的批处理文件
  • exe文件
  • 为了运行exe,我需要设置一些环境变量,这是通过批处理文件完成的

    set MSDEV_HOME=C:\Program Files\Microsoft Visual Studio 8\VC
    set FOO_ROOT=D:\UGS\Support_Dev\2005SR1
    set FOO_DATA=X:
    call %FOO_DATA%\FOO_profilevars
    set FOO_BIN=B:
    set FOO_LIB=L:
    set FOO_INCLUDE=I:
    
    上述批处理文件中的
    FOO_profilevars
    是另一个存在于不同硬盘上的批处理文件(这也只是设置环境)

    设置好环境后,我将调用exe

    出于某些原因,我不得不单独做这件事——我不能将这两件事合并到另一个批处理文件或其他文件中,然后完成这些事情

    我试着执行:

    ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
            Process p = pb.start();
            int exitValue = p.waitFor();
            Map<String, String> env = pb.environment();
            System.out.println("exitStatus > " + exitValue);
    
    
    ProcessBuilder pb2 = new ProcessBuilder("d:\\newlogin\\tcelogin.exe",
    "Eid123", "Eid123");        
            Process p2 = pb2.start();
            int exitValue2 = p2.waitFor();
            Map<String, String> env2 = pb2.environment();
            System.out.println("exitStatus > " + exitValue2);
    

    请记住,批处理文件是在Windows命令解释器
    cmd.exe
    的新实例中运行的。无论您在环境中设置了什么,都会保留在该过程中。您启动的下一个流程将不会看到任何这些更改,因为到那时,这些更改所在的流程早已过时

    您可能希望在批处理文件的末尾运行程序,以确保获得正确的环境

    或者,您可以在Java应用程序中更改环境,然后生成流程。环境从调用过程中继承,因此您启动的程序将继承您在Java中预先设置的环境


    ETA:这是一个从未使用Java生成进程的人写的。这就是进程及其环境在Windows中的工作方式。如果重新使用
    ProcessBuilder
    效果更好,请使用它。尽管我仍然认为,从Java内部设置环境比出于同样目的使用批处理文件“更干净”。

    请记住,批处理文件是在Windows命令解释器
    cmd.exe的新实例中运行的。无论您在环境中设置了什么,都会保留在该过程中。您启动的下一个流程将不会看到任何这些更改,因为到那时,这些更改所在的流程早已过时

    您可能希望在批处理文件的末尾运行程序,以确保获得正确的环境

    或者,您可以在Java应用程序中更改环境,然后生成流程。环境从调用过程中继承,因此您启动的程序将继承您在Java中预先设置的环境


    ETA:这是一个从未使用Java生成进程的人写的。这就是进程及其环境在Windows中的工作方式。如果重新使用
    ProcessBuilder
    效果更好,请使用它。尽管我仍然认为,从Java内部设置环境比出于同样目的使用批处理文件更“干净”。

    难道不能重用第一个
    ProcessBuilder

    ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
    ....
    pb.command("d:\\newlogin\\tcelogin.exe", "Eid123", "Eid123");            
    pb.start();
    int exitValue2 = p.waitFor();
    Map<String, String> env2 = pb.environment();
    System.out.println("exitStatus > " + exitValue2);
    
    ProcessBuilder pb=newprocessbuilder(“D:\\newlogin\\setup.bat”);
    ....
    命令(“d:\\newlogin\\tcelogin.exe”、“Eid123”、“Eid123”);
    pb.start();
    int exitValue2=p.waitFor();
    Map env2=pb.environment();
    System.out.println(“exitStatus>”+ExitValue 2);
    
    或者手动附加第一个环境中尚未在第二个环境中的所有值tn

    ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
    ...
    Map<String, String> env = pb.environment();
    ...
    ProcessBuilder pb2 = new ProcessBuilder("d:\\newlogin\\tcelogin.exe",
    "Eid123", "Eid123");  
    Map<String, String> env2 = pb2.environment();
    [PSEUDOCODE]
    loop: for key,value in env
      check if key exists in env2
        if not: add (key,value) to env2
        else: check if values different and add
    [/PSEUDOCODE]
    pb2.start();
    ....
    
    ProcessBuilder pb=newprocessbuilder(“D:\\newlogin\\setup.bat”);
    ...
    Map env=pb.environment();
    ...
    ProcessBuilder pb2=新的ProcessBuilder(“d:\\newlogin\\tcelogin.exe”,
    “Eid123”、“Eid123”);
    Map env2=pb2.environment();
    [伪代码]
    循环:对于键,为env中的值
    检查env2中是否存在密钥
    如果不是:将(键、值)添加到env2
    其他:检查值是否不同并添加
    [/PSEUDOCODE]
    pb2.start();
    ....
    
    您不能重用第一个
    ProcessBuilder

    ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
    ....
    pb.command("d:\\newlogin\\tcelogin.exe", "Eid123", "Eid123");            
    pb.start();
    int exitValue2 = p.waitFor();
    Map<String, String> env2 = pb.environment();
    System.out.println("exitStatus > " + exitValue2);
    
    ProcessBuilder pb=newprocessbuilder(“D:\\newlogin\\setup.bat”);
    ....
    命令(“d:\\newlogin\\tcelogin.exe”、“Eid123”、“Eid123”);
    pb.start();
    int exitValue2=p.waitFor();
    Map env2=pb.environment();
    System.out.println(“exitStatus>”+ExitValue 2);
    
    或者手动附加第一个环境中尚未在第二个环境中的所有值tn

    ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
    ...
    Map<String, String> env = pb.environment();
    ...
    ProcessBuilder pb2 = new ProcessBuilder("d:\\newlogin\\tcelogin.exe",
    "Eid123", "Eid123");  
    Map<String, String> env2 = pb2.environment();
    [PSEUDOCODE]
    loop: for key,value in env
      check if key exists in env2
        if not: add (key,value) to env2
        else: check if values different and add
    [/PSEUDOCODE]
    pb2.start();
    ....
    
    ProcessBuilder pb=newprocessbuilder(“D:\\newlogin\\setup.bat”);
    ...
    Map env=pb.environment();
    ...
    ProcessBuilder pb2=新的ProcessBuilder(“d:\\newlogin\\tcelogin.exe”,
    “Eid123”、“Eid123”);
    Map env2=pb2.environment();
    [伪代码]
    循环:对于键,为env中的值
    检查env2中是否存在密钥
    如果不是:将(键、值)添加到env2
    其他:检查值是否不同并添加
    [/PSEUDOCODE]
    pb2.start();
    ....
    
    需要分别执行这些操作的原因是什么?这听起来像是很多痛苦的根源。这些需要分开做的原因是什么?这听起来像是很多痛苦的根源。不幸的是,我不能。因为pb.environment()本身没有列出我在批处理文件中设置的环境。不幸的是,我不能。因为pb.environment()本身没有在批处理文件中列出我设置的环境。