Манипуляции с переменными среды пользователя и системы из командной строки в Windows 10

Манипуляции с переменными среды пользователя и системы из командной строки в Windows 10

Я использовал следующие команды для установки/удаления переменных среды пользователя/системы:

СИСТЕМА:

setx -m PATH "%PATH%C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;"

ПОЛЬЗОВАТЕЛЬ:

setx VAR1 "CONTENT OF VAR1"

Позже я обнаружил эти ограничения:

  1. Если %PATH%слишком длинное, то я получаю следующее предупреждение и %PATH%переменная усекается:

ВНИМАНИЕ: Сохраняемые данные обрезаются до 1024 символов.

  1. Как говорится в справке по setxкоманде:

При использовании Setx.exe для очистки значения переменной среды имя переменной среды не изменяется.

Другими словами, когда я запущусь setx -m OCVLIBDIR "", то файл OCVLIBDIRне будет удален, а станет пустым.

Как мне преодолеть эти ограничения?

PS: Я предпочитаю инструменты, входящие в состав Windows 10 (например, PowerShell), но не вижу ничего плохого в использовании сторонних инструментов (хотя мне это кажется излишеством).

PPS: Я знаю, что можно редактировать переменные через графический интерфейс Windows, регистры или некоторые сторонние инструменты с графическим интерфейсом, но я предпочитаю скрипты, потому что я могу запрограммировать несколько сценариев и быстро переключаться между ними. Это полезно, когда я экспериментирую с различными библиотеками в своей системе (например, различными версиями OpenCV и т. д.).

решение1

PowerShell

Эта статья TechNetописывает основы.

Этот ответописывает получение переменных среды системы и пользователя (на что в первой статье был только намек). "Machine"для системы, "User"для текущего пользователя и "Process"для текущего процесса, который работает для получения окончательной комбинации система/пользователь.

О конкатенации PowerShell говорится вэтот вопрос и ответы на него. Вы можете собирать строки, используя +для конкатенации или использовать замену, как в "{0} {1}" -f "Hello","World".

Скобки используются для группировки конструкций.

Переменные не типизированы, не объявлены и начинаются с $.

Если собрать все это вместе, то получится что-то вроде:

$path = [Environment]::GetEnvironmentVariable("PATH","User")
[Environment]::SetEnvironmentVariable("PATH",$path+";C:\Temp","User")

Или в одной строке:

[Environment]::SetEnvironmentVariable("PATH",([Environment]::GetEnvironmentVariable("PATH","User"))+";C:\Temp","User")

Эта статьяописывает, как удалить переменные среды ( $null— это специальная переменная):

[Environment]::SetEnvironmentVariable("MyTestVariable",$null,"User")

Изменения переменных среды, выполненные таким образом, доступны глобально.


КМД

reg.exeможно добавлять, изменять и удалять записи реестра. Переменные среды находятся в реестре.Этот ответрассказывает об использовании regдля удаления переменных среды.

Для переменных среды пользователя:

reg DELETE HKCU\Environment /v envvarname

Для системных переменных среды:

reg DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v envvarname

( HKCUвзаимозаменяемо с HKEY_CURRENT_USER. HKLMвзаимозаменяемо с HKEY_LOCAL_MACHINE.)

(Обратите внимание, что CMDпустые переменные среды обрабатываются так же, как и несуществующие переменные среды. Однако я понимаю, что вы пытаетесь удалить переменную из системы.)

Связанный контент