Получение Java среды ProcessBuilder для сохранения для нескольких команд - PullRequest
1 голос
/ 21 июня 2020

Я хочу использовать ProcessBuilder для создания среды, которую я могу повторно использовать для нескольких пакетных файлов, чтобы автоматизировать некоторые тесты, которые я постоянно выполняю. В частности, мне нужно запустить vcvars64.bat (x64 Native Tools Command Prompt for VS 2019), чтобы настроить системную среду, прежде чем я запускаю свои тесты.

Чтобы запустить тесты вручную, я бы вызвал команду приглашение, запустите vcvars64.bat, а затем вручную запустите несколько пакетных файлов.

Я смог использовать ProcessBuilder для запуска своих тестовых пакетных файлов, но они возвращают ошибку, которую я вижу, если я забыл запустить vcvars64.bat перед запуском тестов.

До сих пор я пытался создать экземпляр ProcessBuilder, используя vcvars64.bat в качестве команды, .start() it, .waitFor() Process to fini sh, а затем повторно использовать тот же ProcessBuilder для Test1.bat, затем Test2.bat et c, в надежде, что он сохранит настройки среды.

Вот соответствующий раздел моего кода:

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() );
}

Мой план верен, а в моей реализации есть ошибки? Или мне нужен новый тарифный план?

1 Ответ

1 голос
/ 21 июня 2020

К сожалению, processBuilder.environment () не улавливает никаких изменений внутри файла bat V C, поэтому ваш двойной запуск не поможет. Однако в зависимости от того, как выглядит vcvars64.bat, вы можете упаковать свой собственный файл launch.cmd, который вы вызываете, передавая два параметра: путь к пакету V C и путь к вашему фактическому сценарию для запуска. Тогда ваша команда 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
...