2010-10-01 69 views
1

我希望能夠設置一個系統環境變量在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

回答

3

另一種可能的方法:

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

相關問題