如何在Perl中设置Win32系统环境变量?
问题描述:
我希望能够设置一个系统环境变量在Perl和我写了下面的脚本(从this idea启发)来实现:如何在Perl中设置Win32系统环境变量?
use Win32;
use Win32::API;
use Win32::OLE qw(in);
my $machine = ".";
my $WMIServices = Win32::OLE->GetObject ("winmgmts:{impersonationLevel=impersonate,(security)}//$machine/root/cimv2") || die;
my $objVariable = $WMIServices->Get("Win32_Environment")->SpawnInstance_;
$objVariable->{Name}="NewOSType";
$objVariable->{UserName} = "<System>";
$objVariable->{VariableValue} = "LAMBDA";
$objVariable->Put_;
不过,我不是在Perl的专家,我想了解专家对此代码的看法。这是完成这个最好的方法吗?
答
另一种可能的方法:
use strict;
use warnings;
use Win32::TieRegistry qw[:KEY_];
use Win32::API;
use constant HWND_BROADCAST => -1;
use constant WM_SETTINGCHANGE => 0x1a;
my $hklm_env = Win32::TieRegistry->new(
'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment',
{ Access => KEY_READ() | KEY_WRITE(), Delimiter => '/' }
); # returns undef if SYSTEM ENV not writable
my $hkcu_env = Win32::TieRegistry->new(
'HKEY_CURRENT_USER/Environment',
{ Access => KEY_READ() | KEY_WRITE(), Delimiter => '/' }
);
# if SYSTEM ENV not writable try USER ENV
my $e = defined($hklm_env) ? $hklm_env : $hkcu_env;
if(defined $e) {
$e->SetValue('Variable', 'Value');
}
else {
warn "Cannot open neither SYSTEM ENV nor USER ENV registry for Read+Write";
}
my $SendMessage = new Win32::API("user32", "SendMessage", 'NNNP', 'N') or die "Couldn't create SendMessage: $!\n";
my $RetVal = $SendMessage->Call(HWND_BROADCAST,WM_SETTINGCHANGE,0,'Environment');
+0
我认为Santhosh的代码更好,因为WMI是Microsoft推荐的方式。而且,它更短。无论如何,WM_SETTINGCHANGE的+1对于那些被直接操作注册表的人所不知道的。 – dolmen 2010-10-01 16:13:01
我不在是Perl或Windows的专家。我建议(以及专家也会)在代码中使用'严格'和'使用警告'。这被认为是良好的做法,并会节省您的时间。 – 2010-10-01 06:59:18
在Unix上,您执行'$ ENV {VARIABLENAME} =“选择的值”;'。 我不知道在Windows上不这样做的原因,但它部分取决于'系统环境变量'的含义。我怀疑你可能会试图篡改注册表。为此,您需要准确的输入。 – 2010-10-01 07:01:33
@Jonathan,系统环境变量,我的意思是你可以在计算机属性>高级>环境变量>系统中找到的环境变量。即使在系统重新启动后,这些变量仍然存在;但是,如果我们执行$ ENV {VARIABLENAME} =“选定的值”,那么该变量仅对当前会话有效。 – Santhosh 2010-10-01 08:17:58