我试图在不检查一系列硬编码路径的情况下获取程序的安装位置,希望从 Windows 注册表中存储的路径中获取它,但是当我尝试读取所需的键值。
我读过关于使用 Perl 解析 Windows 注册表,我想我已经将所有答案合并到我的脚本中,但是当我尝试读取注册表值时,即使从提升的命令提示符运行以确保脚本具有管理员权限,我总是得到空结果。
我首先尝试使用 Win32::TieRegistry,正如前面提到的,返回值是空的,所以然后我尝试只是剔除并使用reg query
,但这会给出有关未找到密钥的错误。运行相同reg query
Perl 外部的命令成功读取密钥。我究竟做错了什么?
Update:根本原因(在我收到的几个答案中指出)是试图从 32 位 Perl 访问 64 位注册表视图;默认情况下,Windows 中的任何 32 位应用程序都会重定向到HKLM\Software\WOW6432Node
当尝试访问时HKLM\Software
钥匙,所以我需要找到一种方法来避免这种情况,因为我感兴趣的钥匙不存在于该位置。
Perl 脚本:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Win32::TieRegistry (Delimiter => '/');
my $mykey = $Registry->{'HKEY_LOCAL_MACHINE/Software/ikv++ technologies ag/medini unite (x64)'};
my $mykeyval = $mykey->{'/Path'};
print " value=$mykeyval\n";
print Dumper $mykey;
my $sysCmd =`reg query "HKLM\\Software\\ikv++ technologies ag\\medini unite (x64)" /v Path`;
print " sysCmd=$sysCmd\n";
Output:
C:\Users\username\AppData\Local\Temp>perl test_reg_read.pl
Use of uninitialized value in concatenation (.) or string at test_reg_read.pl line 9.
value=
$VAR1 = {};
ERROR: The system was unable to find the specified registry key or value.
sysCmd=
Manual reg query
Perl 之外的命令:
C:\Users\username\AppData\Local\Temp>reg query "HKLM\Software\ikv++ technologies ag\medini unite (x64)" /v Path
HKEY_LOCAL_MACHINE\Software\ikv++ technologies ag\medini unite (x64)
Path REG_SZ C:\Program Files\ikv++ technologies ag\mediniUnite
请注意,所有这些现在都是从提升的命令提示符运行的;一旦它在那里工作,我就会尝试一下是否有必要。