Я использовал следующие команды для установки/удаления переменных среды пользователя/системы:
СИСТЕМА:
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"
Позже я обнаружил эти ограничения:
- Если
%PATH%
слишком длинное, то я получаю следующее предупреждение и%PATH%
переменная усекается:
ВНИМАНИЕ: Сохраняемые данные обрезаются до 1024 символов.
- Как говорится в справке по
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
пустые переменные среды обрабатываются так же, как и несуществующие переменные среды. Однако я понимаю, что вы пытаетесь удалить переменную из системы.)