微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用getRuntime.execmd更改registry项的值不会更改registry值,即使操作已成功结束

我试图从我的Java应用程序更改registry值。 我使用这个命令:

LoudnessEqualizationToggle.execCmdnoreturn("reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"+guid+"\FxProperties"" + " /f /v "{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4" /t REG_DWORD /d ""+((activateLEOnKey) ? 1 : 0)+""");

凡guid是{d348b8e8-3118-4a9c-9b43-422647b555ca}

activateLEOnKey是布尔值

execCmdnoreturn函数

用date分隔文件

Windows CMD的FINDSTR错误的正则expression式匹配

将唯一文件批量复制到新文件

用Start打开单独的窗口

Windowsbatch file从文本文件提取envvariables

public static final void execCmdnoreturn(String cmd) { try { Scanner s = new Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\A"); System.out.println("Command:"+cmd); System.out.println("Printing executed data"); while (s.hasNext()) { System.out.println(s.next()); } } catch (IOException ex) { Logger.getLogger(LoudnessEqualizationToggle.class.getName()).log(Level.SEVERE,null,ex); } }

一切正常。 我得到输出到命令提示符下:

操作成功完成

所以我开始注册,以validation价值是否已经改变,但我感到惊讶没有任何改变。 价值是一样的以前。

我有权限吗?

我使用batch file来以pipe理员身份运行我的应用程序。

batch file:

cd %~dp0 java -jar LoudnessEqualizationToggle.jar pause

创build的快捷方式,并以pipe理员身份运行。

你是那个钥匙的主人吗?

我使用batch filetesting了我的命令和权限,如果Windowsregistry中的当前值0可以按预期更改为1 。

该testing的batch file是:

cd %~dp0 reg add "HKEY_LOCAL_MACHInesOFTWAREMicrosoftwindowsCurrentVersionMMDevicesAudioRender{d348b8e8-3118-4a9c-9b43-422647b555ca}FxProperties" /f /v "{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4" /t REG_DWORD /d "1" net stop audiosrv //just restarting audio down here,not important net stop AudioEndpointBuilder net start audiosrv net start AudioEndpointBuilder pause

batch file执行后,Windowsregistry中的值已从0更改为1(所需的操作)。

所以当我直接从命令提示符窗口运行我的命令,我可以看到值改变。 但是,当我在我的Java应用程序中运行我的命令从运行时执行,在Windowsregistry中没有任何值更改,虽然我看到命令执行没有问题。 而在我的Javadebugging,我看到完全相同的命令正在执行,因为我有batch file。

什么可能是没有得到由我的Java应用程序内执行reg.exe命令更改registry值的原因?

过程监视器屏幕(在由Mofi提示之后):

批量file upload.txt到FTP

批量redirect到两个位置

如何查找和删除文本文件中的控制字符

如何获得batch file中给定path中的第一个(最后修改的)文件名称

For循环中的错误级别(批处理窗口)

进程监视器日志中的WOW6432Node表示Java代码是在Windows x64的32位环境中使用32位Java执行的。 因此,被调用的reg.exe也是32位%systemRoot%sysWOW64reg.exe ,因此修改了WOW6432Node的DWORD值。

有关Windows的详细信息的Microsoft文章在Windows上:

文件系统重定向

注册重定向

受WOW64影响的注册表键

WOW64实现细节

在32位和64位Windows上运行32位和64位Java的一种解决方案是:

获取环境变量SystemRoot字符串值。

检查文件SystemRoot + "\Sysnative\reg.exe"存在。

对于在Windows x64上执行的32位Java只有这种情况。 在所有其他情况下,即Windows x64上的64位Java或Windows x86上的32位Java,此文件不存在,因为Sysnative不存在。 是的,对于Windows x64上的64位应用程序, Sysnative不存在。

如果在Windows目录中的Sysnative中存在reg.exe文件,请调用SystemRoot + "\Sysnative\reg.exe" 。

否则,请调用SystemRoot + "\System32\reg.exe" ,这是Windows x64上的64位Java以及Windows x86上的32位Java的正确可执行文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐