获取 Java ProcessBuilder 环境以持久保存多个命令
Getting Java ProcessBuilder environment to persist for multiple commands
我想使用 ProcessBuilder 创建一个可以重复用于多个批处理文件的环境,以便自动执行一些我重复执行的测试。具体来说,我需要 运行 vcvars64.bat
(x64 Native Tools Command Prompt for VS 2019) 在我 运行 我的测试之前设置系统环境。
要手动 运行 测试,我会调出命令提示符 运行 vcvars64.bat,然后手动 运行 一些批处理文件。
我已经能够使用 ProcessBuilder 来启动我的测试批处理文件,但是它们 return 如果我在 [=33= 之前忘记 运行 vcvars64.bat 我看到的错误]进行测试。
到目前为止,我的尝试是使用 vcvars64.bat 作为命令来实例化一个 ProcessBuilder,.start()
它,.waitFor()
Process 完成,然后为 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.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
我想使用 ProcessBuilder 创建一个可以重复用于多个批处理文件的环境,以便自动执行一些我重复执行的测试。具体来说,我需要 运行 vcvars64.bat
(x64 Native Tools Command Prompt for VS 2019) 在我 运行 我的测试之前设置系统环境。
要手动 运行 测试,我会调出命令提示符 运行 vcvars64.bat,然后手动 运行 一些批处理文件。
我已经能够使用 ProcessBuilder 来启动我的测试批处理文件,但是它们 return 如果我在 [=33= 之前忘记 运行 vcvars64.bat 我看到的错误]进行测试。
到目前为止,我的尝试是使用 vcvars64.bat 作为命令来实例化一个 ProcessBuilder,.start()
它,.waitFor()
Process 完成,然后为 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.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