我试图在没有检查一系列硬编码路径的情况下获取程序的安装位置,希望从存储在Windows注册表中的路径中获取它,但是我得到空的返回值或者当我尝试读取所需的键值时出现错误消息。从Perl注册表中读取Perl
我已阅读Parsing windows registry using Perl,我想我已经将所有答案都包含在脚本中,但是当我尝试读取注册表值时,即使从提升的命令提示符运行时,我也会得到空的结果以确保脚本具有管理权限。
我第一次尝试使用Win32 :: TieRegistry,并提到返回的值是空的,所以然后我试图只是脱壳并使用reg query
,但这给出了一个关于找不到密钥的错误。在Perl外部运行相同的reg query
命令可成功读取密钥。我究竟做错了什么?
更新:的根本原因(在我收到的夫妇的答案指出)试图access a 64-bit registry view from a 32-bit Perl;默认情况下,Windows中的任何32位应用程序在尝试访问HKLM\Software
密钥时都被重定向到HKLM\Software\WOW6432Node
,所以我需要找到一种方法来避免这种情况,因为我的感兴趣的密钥在该位置不存在。
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";
输出:
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=
的Perl以外手册reg query
命令:
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
请注意,所有这些都是从提升的命令提示符开始运行;一旦它在那里工作,我将试验是否有必要。
应该是'LMachine',而不是'HKEY_LOCAL_MACHINE'。 – ikegami
获取子键(与值相对)时应该有一个尾随的'/' – ikegami
失败的注册表提取后'$^E'中的错误消息。 – ikegami