Назад | Перейти на главную страницу

использование powershell для обновления системного пути не сразу работает?

Я пытаюсь использовать powershell для обновления системного пути Windows:

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path
$newpath = "$oldpath;C:\nuget"
Write-Output "PATH:$newpath"
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -Force
Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH   

похоже, работает, Get-ItemProperty показывает, что "C: \ nuget" добавлен в путь. Проблема в том, что я запускаю новую консоль PowerShell или консоль командной строки и набираю «nuget», я все равно получаю «Термин« nuget »не распознается как имя командлета, функции, файла сценария или работающей программы»

в новой консоли PowerShell, если я повторно запускаю Get-ItemProperty, он показывает, что новый путь есть, он просто не сразу вступает в силу в текущем пользовательском сеансе. Если я запустил "set" в консоли cmd, нового пути не было в переменной PATH.

Кстати, после запуска Set-ItemProperty я проверил панель управления-> Система-> Расширенная настройка системы-> Переменные среды, новый путь, который я добавил, есть.

Я обнаружил, что если я вручную изменю Путь через системные настройки Windows, он вступит в силу немедленно (новый cmd / powershell будет иметь это); но если путь изменен командой PowerShell Set-ItemProperty, мне нужно выйти из системы, затем войти в систему, тогда новый путь вступит в силу.

Похоже, что системный путь кэшируется в текущем сеансе входа пользователя.

Когда вы изменяете переменную PATH с помощью панели управления, когда вы нажимаете «ОК», панель управления отправляет сообщение WM_SETTINGCHANGE всем открытым окнам, чтобы они знали, что переменные среды были изменены.

Итак, если вы не хотите выходить из системы, вы должны сами отправить WM_SETTINGCHANGE, создав / найдя небольшую программу, которая отправляет это сообщение в соответствии с документацией: https://msdn.microsoft.com/en-us/library/windows/desktop/ms725497%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

Просто хочу опубликовать полный ответ от https://mnaoumov.wordpress.com/2012/07/24/powershell-add-directory-to-environment-path-variable/ , следующий сценарий PowerShell сделает свое дело:

    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -Force

    $HWND_BROADCAST = [IntPtr] 0xffff;
    $WM_SETTINGCHANGE = 0x1a;
    $result = [UIntPtr]::Zero

    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);
"@
    }
    # notify all windows of environment block change
    [Win32.Nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref] $result);