используя rundll32 user32.dll, чтобы указать, что среда пользователя изменилась - PullRequest
1 голос
/ 06 июля 2010

У меня нет возможности изменять переменные окружения в Windows 7. Однако я получил разрешение на изменение настроек реестра.Так, например, я могу изменить: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Ключ среды: BPATH, который добавляется в конец path моей системы.действует до следующей перезагрузки.

Я хотел бы найти командную строку «Alwasy Installed», которая может сигнализировать об изменении BPATH, так что «PATH» всегда обновляется для последующих программ и окон.

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

Условия:

  1. Я могу редактировать путь и bpath только через реестр, но не из вкладки Система, Дополнительно ...
  2. Я не хочуУстановите любое программное обеспечение, которое не является частью стандартной установки Windows 7.
  3. Как правило, это должно быть сделано из приглашения CMD в приглашении PowerShell.

Ответы [ 3 ]

1 голос
/ 24 июля 2012

Это звучит сложно, и не может быть сделано с помощью 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.

1 голос
/ 29 июля 2016

Powershell:

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

Ну вот, Установите переменную Path Machine на себя

(Имейте в виду, что если вы изменили «путь» и он не обновился для Explorer.exe, Powershell, вероятно, снова сбросит текущую среду!)

0 голосов
/ 24 ноября 2010

В Powershell следующая команда установит системную переменную 'variableName' в значение variableValue. Последнее значение может быть Machine, User или Process

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

Оболочка отправляет обновление среды трансляции в систему. Любые открытые оболочки не получат новую переменную среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...