从32位java运行64位windows命令

从32位java运行64位windows命令,java,windows,registry,32bit-64bit,runtime.exec,Java,Windows,Registry,32bit 64bit,Runtime.exec,我正在开发一个JavaSWT应用程序,它需要显示安装在本地windows机器上的ODBC驱动程序(64位)。我提出了一个reg查询语句,可以实现这一点 reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources" /f * 当我在命令提示符下运行这个命令时,我得到了预期的输出。但是当我从32位java运行相同的命令时,reg查询失败。下面是示例代码 String cmd = "reg query \"HKEY_LOCAL_MACHINE\\

我正在开发一个JavaSWT应用程序,它需要显示安装在本地windows机器上的ODBC驱动程序(64位)。我提出了一个reg查询语句,可以实现这一点

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources" /f *
当我在命令提示符下运行这个命令时,我得到了预期的输出。但是当我从32位java运行相同的命令时,reg查询失败。下面是示例代码

String cmd = "reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *";
        System.out.println(cmd);
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

        line = null;
        BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while ((line = err.readLine()) != null) {
            System.out.println(line);
        }
输出

ERROR: The system was unable to find the specified registry key or value.
经过阅读,我发现windows具有注册表重定向,这阻止我的32位java使用64位注册表和64位reg.exe

我试图在system32文件夹中硬编码64位reg.exe的路径,但仍然失败

String cmd = "C:\\Windows\\System32\\reg.exe query \"HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *";
无论如何,解决这个问题


提前谢谢。

谢谢大家的帮助。我找到了解决办法。我必须使用sysnative文件夹从32位应用程序访问64位工具

因此,我将我的req查询语句更新为

String cmd = "C:\\Windows\\Sysnative\\reg.exe query \"HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *";
输出

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources
jbb    REG_SZ    IBM Integration (9.0.0.1) - DataDirect Technologies 7.0 64-BIT Oracle Wire Protocol

谢谢你们的帮助。我找到了解决办法。我必须使用sysnative文件夹从32位应用程序访问64位工具

因此,我将我的req查询语句更新为

String cmd = "C:\\Windows\\Sysnative\\reg.exe query \"HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources\" /f *";
输出

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources
jbb    REG_SZ    IBM Integration (9.0.0.1) - DataDirect Technologies 7.0 64-BIT Oracle Wire Protocol

从命令行运行时,
cmd.exe
shell将删除不必要的引号。当直接从Java运行时,引号保留在中,结果参数指定一个不存在(且无效)的键。@JimGarrison它不是因为引号。我已经通过删除引号进行了检查,并再次运行它。我尝试按照您的建议删除引号
String cmd=“reg query HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC数据源/f*”这次输出的语法不正确。我尝试从HKLM树中访问另一个值,它成功了
String cmd1=“reg query\”HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\”/v ProcessorNameString”根本原因看起来像java和windows之间的架构差异。有关正确创建和处理进程的许多好提示,请参阅。然后忽略它引用
exec
,并使用
ProcessBuilder
创建流程。还可以将
String arg
分解为
String[]args
,以说明包含空格字符的路径等内容。从命令行运行时,
cmd.exe
shell会删除不必要的引号。当直接从Java运行时,引号保留在中,结果参数指定一个不存在(且无效)的键。@JimGarrison它不是因为引号。我已经通过删除引号进行了检查,并再次运行它。我尝试按照您的建议删除引号
String cmd=“reg query HKLM\\SOFTWARE\\ODBC\\ODBC.INI\\ODBC数据源/f*”这次输出的语法不正确。我尝试从HKLM树中访问另一个值,它成功了
String cmd1=“reg query\”HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\”/v ProcessorNameString”根本原因看起来像java和windows之间的架构差异。有关正确创建和处理进程的许多好提示,请参阅。然后忽略它引用
exec
,并使用
ProcessBuilder
创建流程。还可以将
字符串arg
分解为
字符串[]args
,以说明包含空格字符的路径之类的情况。