Я пытаюсь использовать 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);