如何在Perl中设置Win32系统环境变量?

如何在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的专家,我想了解专家对此代码的看法。这是完成这个最好的方法吗?

+6

我不在是Perl或Windows的专家。我建议(以及专家也会)在代码中使用'严格'和'使用警告'。这被认为是良好的做法,并会节省您的时间。 – 2010-10-01 06:59:18

+1

在Unix上,您执行'$ ENV {VARIABLENAME} =“选择的值”;'。 我不知道在Windows上不这样做的原因,但它部分取决于'系统环境变量'的含义。我怀疑你可能会试图篡改注册表。为此,您需要准确的输入。 – 2010-10-01 07:01:33

+1

@Jonathan,系统环境变量,我的意思是你可以在计算机属性>高级>环境变量>系统中找到的环境变量。即使在系统重新启动后,这些变量仍然存在;但是,如果我们执行$ ENV {VARIABLENAME} =“选定的值”,那么该变量仅对当前会话有效。 – Santhosh 2010-10-01 08:17:58

另一种可能的方法:

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