2010-07-06 71 views
1

我無法修改Windows 7中的環境變量。 但是,我被授予了修改註冊表設置的權限。 因此,例如我可以修改: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment 關鍵:BPATH 它附加到我的系統的pathEnv的末尾。使用rundll32 user32.dll來指示用戶的環境已更改

但是當我進行更改時,更改不會生效,直到下一次重新啓動。

我想找到一個命令行是「Alwasy Installed」,它可以用信號通知BPATH的變化,以便隨後的程序和窗口始終更新「PATH」。

rundll user32.dll, [ BroadcastSystemMessage PATH CHANTGED... or somehting...] 

條件:

  1. 我只能通過編輯註冊表路徑和bpath,而不是從系統,高級選項卡...
  2. 我不想安裝任何軟件,不是標準的開箱即用的Windows 7安裝程序的一部分。
  3. 通常,這應該從PowerShell提示符的CMD提示符完成。

回答

0

在Powershell中,以下命令將設置系統變量'variableName'爲variableValue的值。 的最後一個值可以是MachineUserProcess

PS C:\>[Environment]::SetEnvironmentVariable("variableName","variableValue","Machine") 

殼發送更新環境廣播到系統。任何打開的shell都不會收到新的環境變量。

0

這聽起來很難,而且不能用rundll32來完成 - 我知道,因爲我已經嘗試過了。這裏有很多問題,rundll的文檔是從那裏鏈接的。這基本上只調用以下形式的函數:

void CALLBACK EntryPoint(HWND hwnd,HINSTANCE hinst,LPSTR lpszCmdLine,int nCmdShow);

http://support.microsoft.com/kb/164787

這意味着 - 你可以調用特殊功能,它被設計爲使用此工具調用,簡單的功能,它沒有參數,或者只是一個HWND。要想刷新環境,你需要廣播(即SendMessageTimeout到HWND_BROADCAST)WM_SETTINGCHANGE消息,4.th參數(wparam)應該是0,並且LPARAM應該是L「環境」(注意L - 它有是一個寬字符串,否則變量將不會刷新!)。

這裏的一些工作PS代碼,我不記得是誰寫的(它實際上 是爲WM_SETTINGCHANGE由C翻譯++ MSDN的例子):

#requires -version 2 

    if (-not ("win32.nativemethods" -as [type])) { 
     # import sendmessagetimeout from win32 
     add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @" 
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern IntPtr SendMessageTimeout(
     IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, 
     uint fuFlags, uint uTimeout, out UIntPtr lpdwResult); 
    "@ 
    } 

    $HWND_BROADCAST = [intptr]0xffff; 
    $WM_SETTINGCHANGE = 0x1a; 
    $result = [uintptr]::zero 

    # notify all windows of environment block change 
    [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, 
      [uintptr]::Zero, "Environment", 2, 5000, [ref]$result); 

它比1級的命令,但適合小腳本。

我還沒有嘗試過一個變量(PATH)中的變量,但它可能是, 這樣的配置需要兩次後續刷新(第一個允許BPATH被更新,而第二個PATH使用更新後的BPATH值

0

PowerShell的:

[Environment]::SetEnvironmentVariable("path",[Environment]::GetEnvironmentVariable("path"),"Machine") 

你去那裏, 設置PATH機變到它的自我

(請注意,如果你改變了 '路徑',它沒有更新Explorer.exe,Powershell可能會重新設置當前環境!)