Это звучит сложно, и не может быть сделано с помощью 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-й аргумент (wparam) должен быть 0, а LPARAM должен быть L "Environment" (обратите внимание на L - он должен быть широкой строкой, иначе переменные не обновятся!).
Вот некоторый рабочий код PS, который я не помню, кто написал (это на самом деле
пример MSDN для WM_SETTINGCHANGE, переведенный с C ++):
#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.