これは難しそうに聞こえますが、rundll32 では実行できません。ここには、rundll のドキュメントのリンク元である多くの質問があります。これは基本的に次の形式の関数のみを呼び出します。
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
http://support.microsoft.com/kb/164787
つまり、このツールで呼び出されるように設計された特別な関数と、引数を取らない単純な関数、または単に HWND を呼び出すことができます。
環境を更新するには、メッセージをブロードキャストする (つまりにSendMessageTimeout)HWND_BROADCAST必要があります。WM_SETTINGCHANGEwparam0LPARAML"Environment"L
WM_SETTINGCHANGEこれは、誰が書いたか覚えていない実際の PS コードです (実際には、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);
これは複数のコマンドですが、小さなスクリプトに収まります。
変数内の変数 (PATH) を使用してトリックを試したことはありませんが、そのような構成では、2 回の更新が必要になる可能性があります (最初の更新では BPATH を更新でき、2 回目の更新では PATH が更新された BPATH を使用します)。価値。