2015-04-17 3 views
2

Почему удаление переменной окружения с помощью reg delete HKCU\Environment /F /V TestVar в Windows 7 Professional удаляет ее из реестра, но переменная все еще существует?Удаление переменных окружения не работает

Вот подробности: Я создал следующие 3 .cmd файлы:

Проверить variable.cmd

echo TestVar = %TestVar% 
pause 

Набор variable.cmd

setx TestVar 123 
pause 

Удалить переменную .cmd

reg delete HKCU\Environment /F /V TestVar 
pause 

Тогда я выполните следующие действия (двойной щелчок, чтобы убедиться, что я начинаю новую сессию каждый раз):

  1. Двойной щелчок по Check variable.cmd и я вижу, что TestVar не существует
  2. Double нажмите на Set variable.cmd, и он говорит: SUCCESS: Specified value was saved.
  3. Двойной щелчок на Check variable.cmd и показывает значение переменной. Хорошо!
  4. Двойной щелчок по Delete variable.cmd и говорит The operation completed successfully.
  5. Двойной щелчок по Check variable.cmd и он все еще показывает значение переменной. Плохо!
  6. Нажмите на меню Пуск, введите environment, нажмите на Edit environment variables for your account, чтобы открыть диалоговое окно Environment Variables, нажмите OK, ничего не меняя
  7. Двойной щелчок по Check variable.cmd и переменная больше не существует

я могу найти значение в реестре после шага 2, я не могу найти его после шага 4, но шаг 5 все еще находит его. И даже если я ничего не изменю, шаг 6 действительно удаляет переменную.

+2

Необходимо передать сообщение, чтобы уведомить приложения (в данном случае проводник Windows) об изменении. См. Http://stackoverflow.com/a/5246097/886887 –

+0

@HarryJohnston: Как транслировать сообщение из пакетного файла? – stenci

ответ

2

Вот решение моей проблемы. Я не знаю, если это правильное решение, но это работает для меня:

Проверить variable.cmd

set TestVar 
@pause 

Набор variable.cmd

setx TestVar 123 
@pause 

Удалить variable.cmd

reg delete HKCU\Environment /F /V TestVar 
setx DummyVarUsedToDelete "" 
reg delete HKCU\Environment /F /V DummyVarUsedToDelete 
@pause 

setx не может быть использован для удаления переменной, как описано here, но при отсутствии нужной трансляции после удаления переменной из реестра с помощью reg delete.

EDIT

я добавил строку для удаления DummyVarUsedToDelete из реестра. Это не будет транслироваться, но это небольшая временная проблема.

+1

Обратите внимание, что это решение оставляет за собой пустую запись для DummyVarUsedToDelete в реестре, которая, вероятно, должна быть удалена. –

0

Реестр читается при загрузке. Когда программа запускается, она получает копию среды своего родителя, обычно среды Explorer.exe.

В комментарии говорится, что проводник (или любая другая графическая программа, действующая на сообщение), если он получает сообщение от какой-либо другой программы (например, setx), предупреждая ее о том, что реестр был изменен, перечитывает реестр.

Ответ прост

Использование set и setx на последовательных линиях.

+1

Проблема заключается в удалении, а не на множестве. Похоже, что 'setx' выполняет свою работу, и Explorer.exe уведомляется. Проблема в том, что 'reg delete' выполняет свое задание, но не уведомляет Explorer.exe – stenci

1

Вы можете использовать setx удалить переменную окружения, это будет транслировать правильное сообщение:

setx TestVar "" 
reg delete HKCU\Environment /F /V TestVar 

(Как уже говорилось в комментариях, используя setx сам по себе оставит пустую запись позади в реестре, который следует исключить для согласованности.)

+0

Из https://technet.microsoft.com/en-us/library/cc755104.aspx: Вы не можете использовать команду setx для удаления значений которые были добавлены в локальную или системную среду. Вы можете использовать set с именем переменной и без значения для удаления соответствующего значения из локальной среды. – stenci

+0

Работает для меня. Я подозреваю, что часть документации устарела. –

+0

Он меняет значение переменной из любого значения, которое оно имеет на "", но оно не удаляет переменную. Часто пустая строка имеет тот же эффект, что и несуществующая переменная, но я хочу ее удалить. – stenci

Смежные вопросы