Мне нужно удалить системные переменные с клиентских рабочих станций. У меня более 500 клиентов, поэтому я хочу предоставить пользователю командный файл, чтобы он сам запускал удаление системных переменных.
Как удалить переменную среды из конфигурации системы с помощью командного файла
Ответы (4)
You may want to make these two permanent with setx but obviously no need to
C:\>set uvar=HKCU\Environment
C:\>
C:\>set mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
C:\>
Немного терминологии
Внутри ключа (который похож на папку) у вас есть переменная с некоторыми данными, например a = 5
http://msdn.microsoft.com/en-us/library/3dwk5axy.aspx говорит о том, что имя (а) имеет значение (5).
Терминология реестра в msdn выглядит немного иначе, но reg.exe и википедия кажутся единообразными. Википедия http://en.wikipedia.org/wiki/Windows_Registry говорит так: «Значения реестра пары имя / данные, хранящиеся в ключах, говорят о паре имя / данные. name (a) data (5) и пара вместе являются значением.
Кажется, что REG использует / v, который, вероятно, относится как к имени переменной, так и к ее данным (как в Википедии), он показывает как имя переменной, так и ее данные. И у REG есть / d, который, я полагаю, предназначен только для данных.
Пример с setx
C:\>reg query %uvar%
HKEY_CURRENT_USER\Environment
TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
...
C:\>setx aaa 3
C:\>reg query %uvar%
HKEY_CURRENT_USER\Environment
TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
...
aaa REG_SZ 3
Если вы попытаетесь использовать setx для его удаления, самое близкое, что вы можете получить, - это очистить его, так как эта статья MS KB это В статье 195050 MS KB говорится, что это оставляет вас в реестре.
setx не удаляет переменную из реестра
C:\>setx aaa ""
SUCCESS: Specified value was saved.
C:\>reg query %uvar%
HKEY_CURRENT_USER\Environment
TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
...
aaa REG_SZ
C:\>
Однако стоит отметить, что переменная отсутствует в командной строке. echo% aaa% отобразит% aaa%, поэтому переменная исчезла. В реестре сейчас просто ненужный хлам.
Пользователь отмечает интересное замечание, что теперь, когда вы пытаетесь установить общесистемную переменную, это не работает. поскольку он перезаписывается тем, что находится в пользовательской переменной, в этом случае он всегда будет иметь значение undefined.
C:\>reg delete %uvar% /v aaa
Delete the registry value aaa (Yes/No)? y
The operation completed successfully.
C:\>
Обратите внимание, что aaa теперь нет. Ниже.
C:\>reg query %uvar%
HKEY_CURRENT_USER\Environment
TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
...
C:\>
Если вы хотите сделать это для переменной среды системы / компьютера, а не для переменной пользователя.
-строки ниже должны быть из командной строки с привилегиями администратора.
-заметим, что ключ - HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment.
-The% mvar% (в отличие от% uvar%) нуждается в кавычках вокруг него Потому что в ключе есть пробел. Если вы пропустите кавычки, ничего страшного, вы просто получите сообщение об ошибке, которое может напомнить вам использовать кавычки.
-И, конечно, если вы хотите установить переменную среды в этой части реестра с помощью setx, используйте, например, setx aaa 5 -m то есть -m после.
C:\>set mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
C:\>reg delete "%mvar%" /v aaa
Delete the registry value aaa (Yes/No)? y
The operation completed successfully.
C:\>
дальнейшее примечание
Вы можете создать переменную среды только с помощью REG ADD или REG DELETE .. (вместо setx), но в любом случае при установке переменной вы можете использовать set тоже, так что он устанавливается для текущего сеанса, а не только для следующего. И ссылка re setx https://superuser.com/questions/647505/set-enviroment-variable-setx
Команда setx с пустым строковым значением не удаляет его. И это не просто придирки, потому что логика совсем другая. Потому что, если пользовательская переменная переопределяет глобальную переменную, то невозможно удалить пользовательскую переменную и заставить глобальную переменную снова «стать активной». Пользовательская переменная с пустой строкой блокирует глобальную переменную. Для этого нужно фактически УДАЛИТЬ его (используя окно переменных среды).
Я только сегодня попробовал это, когда глобальная переменная JAVA_HOME была переопределена конкретным пользователем JAVA_HOME. Невозможно было снова сделать глобальную переменную активной без полного удаления пользовательской переменной. И до сих пор я не видел способа сделать это из командной строки или пакетного сценария.
(Недостаточно очков репутации, чтобы добавить комментарий к приведенному выше ответу о setx, поэтому мне нужно добавить свой собственный ответ ...)
Вам нужно будет изменить этот раздел реестра:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
Изменения вступают в силу после перезагрузки.
Если вы хотите избежать перезагрузки, вы должны найти способ транслировать WM_SETTINGSCHANGE
в каждое активное окно после удаления значения.
Это заставит новые окна CMD заметить, что переменная была удалена (и любая другая программа, которая понимает WM_SETTNGSCHANGE
).