Windows имеет setx
команду:
Description:
Creates or modifies environment variables in the user or system
environment.
Таким образом, вы можете установить переменную следующим образом:
setx FOOBAR 1
И вы можете очистить значение следующим образом:
setx FOOBAR ""
Однако переменная не удаляется. Это остается в реестре:
Так как бы вы на самом деле удалили переменную?
windows
registry
environment-variables
Питер Мортенсен
источник
источник
Ответы:
Чтобы удалить переменную из текущей среды ( не навсегда):
Чтобы окончательно удалить переменную из пользовательской среды (которая по умолчанию используется для
setx
этого):Если переменная установлена в системной среде (например, если вы изначально установили ее с помощью
setx /M
), запустите администратор:Примечание. Приведенные
REG
выше команды не влияют ни на какие существующие процессы (и некоторые новые процессы, которые разветвляются из существующих процессов), поэтому, если важно, чтобы изменения вступили в силу немедленно, самый простой и надежный способ - выйти из системы и вернуться обратно. или перезагрузка. Если это не вариант или вы хотите копнуть глубже, у некоторых из других ответов здесь есть несколько полезных советов, которые могут подойти для вашего случая использования.источник
setx JUNK Hello
. Откройте новый cmd. Введитеecho %JUNK%
и получитеHello
. Затем я делаюREG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK
и подтверждаю, что значение пропало из реестра. Я открываю новый cmd и печатаюecho %JUNK%
и все равно получаюHello
. Поиск в реестре показывает отсутствие JUNK. Пожалуйста, не говорите мне, что вам нужна перезагрузка!user
среды, это удается. Затем, когда я набираю команду, я получаюThe system was unable to find the specified registry or key value
. Кроме того, глобальный поискJUNK
в реестреregedit
ничего не дает. Тем не менее, когда я открываю новое командное окно (через Пуск / Аксессуары или cmd.exe в Run) и набираюecho %JUNK%
, значение все еще там!SET
списка для следующей оболочки cmd), а затем удалить его из реестра, например:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Чтобы удалить переменную из текущего сеанса команды, не удаляя ее навсегда, используйте обычную встроенную
set
команду - просто не ставьте ничего после знака равенства:set FOOBAR=
Для подтверждения запустите
set
без аргументов и проверьте текущую среду. Переменная должна отсутствовать в списке полностью.источник
Это было рассмотрено довольно много, но есть важная часть информации, которая отсутствует. Надеюсь, я смогу помочь разобраться, как это работает, и немного облегчить усталых путешественников. :-)
Удалить из текущего процесса
Очевидно, что все знают, что вы просто делаете это, чтобы удалить переменную окружения из вашего текущего процесса:
Постоянное удаление
Существует два набора переменных среды: общесистемные и пользовательские.
Удалить переменную среды пользователя:
Удалить общесистемную переменную среды:
Применить значение без перезагрузки
Вот волшебная информация, которой не хватает! Вы задаетесь вопросом, почему после того, как вы это сделаете, когда вы запускаете новое командное окно, переменная окружения все еще там. Причина в том, что explorer.exe не обновил свою среду. Когда один процесс запускает другой, новый процесс наследует среду от процесса, который его запустил.
Есть два способа исправить это без перезагрузки. Самый грубый способ - убить процесс explorer.exe и запустить его снова. Вы можете сделать это из диспетчера задач . Однако я не рекомендую этот метод.
Другой способ - сообщить explorer.exe, что среда изменилась и что она должна перечитать ее. Это делается путем трансляции сообщения Windows (WM_SETTINGCHANGE). Это можно сделать с помощью простого скрипта PowerShell. Вы можете легко написать один, чтобы сделать это, но я нашел его в окне «Настройки окна обновления после сценариев изменений» :
Резюме
Поэтому, чтобы удалить переменную среды пользователя с именем «FOO» и отразить это изменение в процессах, которые вы запускаете впоследствии, выполните следующие действия.
Обратите внимание, что вам, вероятно, придется обновить настройки PowerShell, чтобы разрешить запуск этого сценария, но я оставлю это как упражнение Google-fu для вас.
источник
source .bashrc
(или ее двоюродные братья) в Windows. Это относится к началу строки "отсылка к этому" для меня.Из PowerShell вы можете использовать
[System.Environment]::SetEnvironmentVariable()
метод .NET :Чтобы удалить переменную среды пользователя с именем
FOO
:Обратите внимание, что
$null
это используется, чтобы лучше сигнализировать о намерении удалить переменную, хотя технически это фактически то же самое, что и передача''
в этом случае.Для удаления системной (на уровне компьютера) переменной среды с именем
FOO
- требуется повышение прав (необходимо запускать с правами администратора):Помимо более быстрого выполнения, преимущество по сравнению с
reg.exe
методом на основе заключается в том, что другие приложения уведомляются об изменении посредствомWM_SETTINGCHANGE
сообщения (хотя не все приложения прослушивают это сообщение).источник
Я согласен с CupawnTae .
SET
бесполезен для изменений в основной среде.К сведению: системные переменные находятся в
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
(гораздо дольше, чем пользовательские переменные).Поэтому полная команда для системной переменной с именем FOOBAR:
(Обратите внимание на кавычки, необходимые для обработки пробела.)
Жаль, что
setx
команда не поддерживает синтаксис удаления. :(PS: Используйте ответственно - если вы убьете свою переменную пути, не вините меня!
источник
Команда в ответе DougWare не сработала, но это сработало:
Ярлык
HKLM
может быть использован дляHKEY_LOCAL_MACHINE
.источник
Удалить без перезагрузки
На вопрос ОП действительно был получен исчерпывающий ответ, в том числе о том, как избежать перезагрузки с помощью powershell, vbscript или других имен.
Однако, если вам нужно придерживаться только команд cmd и вы не можете позволить себе вызывать powershell или vbscript, вы можете использовать следующий подход:
Итак, магия здесь в том, что с помощью «setx» назначить что-то переменной, которая вам не нужна (в моем примере DUMMY), вы заставляете Explorer.exe перечитывать переменные из реестра, не используя powershell. Затем вы убираете этот манекен, и, хотя он будет оставаться в среде Explorer еще немного, он, вероятно, никому не повредит.
Или, если после удаления переменных вам нужно установить новые, вам даже не понадобится пустышка. Простое использование SETX для установки новых переменных автоматически удалит только что удаленные из любых новых задач cmd, которые могут начаться.
Справочная информация: я только что успешно использовал этот подход, чтобы заменить набор пользовательских переменных системными переменными с одинаковыми именами на всех компьютерах в моей работе, изменив существующий сценарий cmd. Слишком много компьютеров, чтобы сделать это вручную, и при этом было непрактично копировать дополнительные PowerShell или VBS-скрипты на все из них. Причина, по которой мне срочно потребовалось заменить пользователя системными переменными, заключалась в том, что пользовательские переменные синхронизировались в перемещаемых профилях (не задумываясь об этом), поэтому несколько машин, использующих один и тот же вход в Windows, но нуждающихся в разных значениях, перепутались.
источник
просто заставляет значение FOOBAR быть пустой строкой. (Хотя это показывается
set
командой с "", так что, возможно, двойные кавычки - это строка.)Я использовал:
и тогда FOOBAR больше не был указан в команде set. (Выход не требуется.)
Windows 7 32-разрядная, используя командную строку, не администратор это то, что я использовал. (Не cmd или Windows+ R, которые могут отличаться.)
Кстати, я не видел переменную, которую я создал где-то в реестре после того, как я ее создал. Я использую RegEdit не как администратор.
источник
Вы также можете создать небольшой скрипт VBScript :
Тогда назови это как
%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
.Недостаток в том, что вам нужен дополнительный скрипт, но он не требует перезагрузки.
источник