Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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 ProcessBuilder环境持久化多个命令_Java_Windows_Processbuilder - Fatal编程技术网

让Java ProcessBuilder环境持久化多个命令

让Java ProcessBuilder环境持久化多个命令,java,windows,processbuilder,Java,Windows,Processbuilder,我想使用ProcessBuilder创建一个可以重用多个批处理文件的环境,以便自动化重复执行的一些测试。具体来说,在运行测试之前,我需要运行vcvvars64.bat(针对VS 2019的x64本机工具命令提示符)来设置系统环境 要手动运行测试,我会打开一个命令提示符,运行vcvars64.bat,然后手动运行一些批处理文件 我已经能够使用ProcessBuilder启动测试批处理文件,但是如果在运行测试之前忘记运行vcvars64.bat,它们会返回我看到的错误 到目前为止,我的尝试是使用vc

我想使用ProcessBuilder创建一个可以重用多个批处理文件的环境,以便自动化重复执行的一些测试。具体来说,在运行测试之前,我需要运行
vcvvars64.bat
(针对VS 2019的x64本机工具命令提示符)来设置系统环境

要手动运行测试,我会打开一个命令提示符,运行vcvars64.bat,然后手动运行一些批处理文件

我已经能够使用ProcessBuilder启动测试批处理文件,但是如果在运行测试之前忘记运行vcvars64.bat,它们会返回我看到的错误

到目前为止,我的尝试是使用vcvars64.bat作为命令实例化ProcessBuilder,
.start()
it,
.waitFor()
完成流程,然后将相同的ProcessBuilder重新用于Test1.bat和Test2.bat等,希望它能保留环境设置

以下是我的代码的相关部分:

ProcessBuilder processBuilder = new ProcessBuilder();
Process process;
Map<String, String> envMap = processBuilder.environment();
for( Map.Entry<String, String> entry : envMap.entrySet() )
{
    System.out.println( "1 - Key: \"" + entry.getKey() + "\", Value: \"" + entry.getValue() + "\"" );
}
try
{
    process = processBuilder.command( "C:\\Windows\\system32\\cmd.exe", "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat" )
        .directory( new File( "C:\\bat\\" ) )
        .redirectInput( new File( "C:\\bat\\", "cr4.txt" ) )
        .redirectOutput( new File( edgePath, "tempFile.txt" ) )
        .start();
    MAIN_LOGGER.log( Level.INFO, "Waiting for the CMD process to finish..." );
    process.waitFor();
    envMap = processBuilder.environment();
    for( Map.Entry<String, String> entry : envMap.entrySet() )
    {
        System.out.println( "2 - Key: \"" + entry.getKey() + "\", Value: \"" + entry.getValue() + "\"" );
    }
    // Now try to run my batch file that requires parameters normally set by vcvars64.bat
    process = processBuilder.command( "C:\\bat\\TestBatch.bat" )
        .directory( new File( "C:\\bat\\" ) )
        .redirectInput( new File( "C:\\bat\\", "cr4.txt" ) )
        .redirectOutput( new File( "C:\\bat\\", "tempFile.txt" ) )
        .start();
}
catch( IOException | InterruptedException e )
{
    System.out.println( e.getLocalizedMessage() );
}
ProcessBuilder ProcessBuilder=new ProcessBuilder();
工艺过程;
Map envMap=processBuilder.environment();
for(Map.Entry:envMap.entrySet())
{
System.out.println(“1-Key:\”“+entry.getKey()+”\,Value:\”“+entry.getValue()+”\);
}
尝试
{
process=processBuilder.command(“C:\\Windows\\system32\\cmd.exe”,“C:\\Program Files(x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat”)
.目录(新文件(“C:\\bat\\”)
.redirectInput(新文件(“C:\\bat\\”,“cr4.txt”))
.redirectOutput(新文件(edgePath,“tempFile.txt”))
.start();
MAIN_LOGGER.log(Level.INFO,“等待CMD进程完成…”);
process.waitFor();
envMap=processBuilder.environment();
for(Map.Entry:envMap.entrySet())
{
System.out.println(“2-Key:\”“+entry.getKey()+”\,Value:\”“+entry.getValue()+”\);
}
//现在尝试运行我的批处理文件,该文件需要通常由vcvars64.bat设置的参数
process=processBuilder.command(“C:\\bat\\TestBatch.bat”)
.目录(新文件(“C:\\bat\\”)
.redirectInput(新文件(“C:\\bat\\”,“cr4.txt”))
.redirectOutput(新文件(“C:\\bat\\”,“tempFile.txt”))
.start();
}
捕获(IOException | InterruptedException e)
{
System.out.println(e.getLocalizedMessage());
}

我的计划正确吗?我的实现有问题吗?或者我需要一个新的计划吗?

不幸的是,processBuilder.environment()无法检测到VC bat文件中的任何更改,因此您的双重启动将无济于事。但是,根据vcvars64.bat的外观,您可能可以打包自己的
launch.cmd
文件,您可以调用该文件并传递两个参数:VC批处理的路径和要运行的实际脚本的路径。然后,您的ProcessBuilder命令类似于:

String launch = "C:\\bat\\launch.cmd";
String vcenv = "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat";
String task  = "C:\\bat\\TestBatch.bat";

String[] cmd = new String[] {"cmd.exe", "/c", launch, vcenv, task};

process = processBuilder.command(cmd);
示例launch.cmd:

call %1
call %2
exit /b %errorlevel%
示例task.bat:

echo RUNNING TASK %0

创建一个批处理文件会不会是一个坏主意?在这个文件中,您将传递执行的
.bat
和输入/输出的参数,它将设置环境并管理所有这些
.bat
执行?我可以在批处理文件中完成整个项目(我基本上已经有了),但我想要在Linux上运行的东西,因此ProcessBuilder。在Linux中实现测试自动化实际上相当容易。Windows是唯一的问题。“不幸的是,processBuilder.environment()无法在VC bat文件中获取任何更改,因此您的双重启动将无济于事。”这就是我需要知道的。我可能会使用Linux在运行时构建一个批处理文件,执行它,然后在完成后删除它。谢谢