這聽起來很難,而且不能用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值