我在用Processbuilder执行Windows程序时遇到问题。下面的代码产生一个命令数组,如:
C:\Program Files\Gdal\bin\gdal\apps\gdalwarp.exe, -t_srs, EPSG:32633, -et, 1, -r, near, H:\GeoData\Raster\1M_WEF30JAN2020_WGS84LL_somlos_8.tif, H:\GeoData\Raster\result.tif
String [] cmd = {"C:\Program Files\Gdal\bin\gdal\apps\gdalwarp.exe",
"-t_srs", "EPSG:" + txtEPSG.getText(),
"-et", txtThreshold.getText().trim(),
"-r", cmbBoxResampl.getSelectedItem().toString(),
txtInFilename.getText(),
txtNewFilename.getText()
};
boolean r = Files.isExecutable(new File("C:\Program Files\Gdal\bin\gdal\apps\gdalwarp.exe").toPath());
java.lang.ProcessBuilder b = new java.lang.ProcessBuilder(cmd);
b.redirectError(ProcessBuilder.Redirect.INHERIT);
b.redirectInput(ProcessBuilder.Redirect.INHERIT);
Map<String,String> map = b.environment();
Process p = b.start();
int rc = p.waitFor();
if (p.exitValue() != 0) {
System.out.println(p.exitValue());
System.out.println("Command: " + cmd[0]);
InputStream errorStream = p.getErrorStream();
int c = 0;
while ((c = errorStream.read()) != -1) {
System.out.print((char)c);
}
}
当我调试java程序时,我可以看到gdalwarp.exe是可执行的,并且环境设置与我在cmd终端中执行gdalwarr.exe时相同。processBuilder似乎没有执行gdalwarp。我得到的退出代码是-103741511,应该是0或-1。errorStream是空的,我没有打印出来。
当我执行C:Program FilesGdalbingdalappsgdalwarp.exe -t_srs EPSG:32633 -et 1 -r near H:GeoDataRaster1M_WEF30JAN2020_WGS84LL_somlos_8.tif H:GeoDataRasterresult.tif
在cmd终端中,我得到了有意义的输出和结果文件:H:\GeoData\Raster\result.tif.
我尝试过使用和不使用gdalwarp.exe的路径,但它只有在cmd终端中才能工作。有什么想法吗?
当我使用ProcessBuilder执行cmd.exe时,我会得到有意义的输出。
-更新----
当我在程序中添加退出代码、isExecutable、env.variables的打印输出时,我得到的是:
Command: C:Program FilesGdal_321bingdalappsgdalwarp.exe, -t_srs, EPSG:32633, -et, 1, -r, near, C:Temp1M_WEF30JAN2020_WGS84LL_somlos_8_overview.tif, C:Temp1M_WEF30JAN2020_8_overview.tif
C:Program FilesGdal_321bingdalappsgdalwarp.exe is exacutable
Exit value:-1073741511
过程环境变量的选择:
PROCESSOR_LEVEL, 6
JAVA_HOME, C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjre
POSTGIS_GDAL_ENABLED_DRIVERS, GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
GDAL_DATA, C:Program FilesGdal_321bingdal-data
GDAL_DRIVER_PATH, C:Program FilesGdal_321bingdalplugins;C:Program FilesGdal_321bingdalplugins-external
PROCESSOR_ARCHITECTURE, AMD64
PSModulePath, C:Program FilesWindowsPowerShellModules;C:WINDOWSsystem32WindowsPowerShellv1.0Modules
SystemDrive, C:
POSTGIS_ENABLE_OUTDB_RASTERS, 1
ProgramFiles(x86), C:Program Files (x86)
CommonProgramFiles, C:Program FilesCommon Files
Path, C:/Users/anpaumal/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_14.0.2.v20200815-0932/jre/bin/server;C:/Users/anpaumal/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_14.0.2.v20200815-0932/jre/bin;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:WINDOWSSystem32OpenSSH;C:Program FilesPythonPython39;C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjrebin;C:Program FilesGdal_321bin;C:Program FilesGdal_321bingdalpythonosgeo;C:Program FilesGdal_321binproj6apps;C:Program FilesGdal_321bingdalapps;C:Program FilesGdal_321binmsapps;C:Program FilesGdal_321bingdalcsharp;C:Program FilesGdal_321bincurl;C:UsersanpaumalAppDataLocalMicrosoftWindowsApps;C:Program Fileseclipse;
PATHEXT, .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
DriverData, C:WindowsSystem32DriversDriverData
OS, Windows_NT
PROJ_LIB, C:Program FilesGdal_321binproj7SHARE
PROCESSOR_REVISION, 9e0d
CommonProgramW6432, C:Program FilesCommon Files
ProgramData, C:ProgramData
ProgramW6432, C:Program Files
CommonProgramFiles(x86), C:Program Files (x86)Common Files
ProgramFiles, C:Program Files
从系统环境中选择设置:
ALLUSERSPROFILE=C:ProgramData
CommonProgramFiles=C:Program FilesCommon Files
CommonProgramFiles(x86)=C:Program Files (x86)Common Files
CommonProgramW6432=C:Program FilesCommon Files
DriverData=C:WindowsSystem32DriversDriverData
GDAL_DATA=C:Program FilesGdal_321bingdal-data
GDAL_DRIVER_PATH=C:Program FilesGdal_321bingdalplugins;C:Program FilesGdal_321bingdalplugins-external;
JAVA_HOME=C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjre
NUMBER_OF_PROCESSORS=12
OS=Windows_NT
Path=C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:WINDOWSSystem32OpenSSH;C:Program FilesPythonPython39;C:Program FilesOpenJDKjdk-8.0.262.10-hotspotjrebin;C:Program FilesGdal_321bin;C:Program FilesGdal_321bingdalpythonosgeo;C:Program FilesGdal_321binproj6apps;C:Program FilesGdal_321bingdalapps;C:Program FilesGdal_321binmsapps;C:Program FilesGdal_321bingdalcsharp;C:Program FilesGdal_321bincurl;C:UsersanpaumalAppDataLocalMicrosoftWindowsApps;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
ProgramData=C:ProgramData
ProgramFiles=C:Program Files
ProgramFiles(x86)=C:Program Files (x86)
ProgramW6432=C:Program Files
PROJ_LIB=C:Program FilesGdal_321binproj7SHARE
PSModulePath=C:Program FilesWindowsPowerShellModules;C:WINDOWSsystem32WindowsPowerShellv1.0Modules
在使用调用p.waitFor()
之前,请尝试读取输出
List<String> results = readOutput(process.getInputStream());
并可能将这些结果打印出来进行检查。
如果我添加工作方向,它就可以工作!
ProcessBuilder b = new java.lang.ProcessBuilder(cmd);
File f = new File("C:\Program Files\Gdal_321\bin\gdal\apps");
b.directory(f);
Process p = b.start();