15

У меня повышенные права на ноутбук, но нет прав администратора. Права администратора необходимы для изменения системных переменных среды. Я ожидал, что если я создам переменную среды пользователя с тем же именем, что и системная переменная среды, переменная пользователя переопределит системную переменную, но это не так.

После добавления пользовательской переменной с тем же именем, что и системная переменная, я открыл новое окно cmd и использовал команду echo для отображения переменной. Он показал мне значение системной переменной вместо значения пользовательской переменной.

Я просто хотел подтвердить это ожидаемое поведение и понять причины этого. Я ожидаю, что более специфичные пользовательские настройки переопределяют системные.

У меня Windows 7.

2 ответа2

19

Согласно статье MSKB переменные среды в Windows NT:

Переменные среды пользователя .... имеют приоритет над системными переменными среды.

Одним заметным исключением является переменная PATH которая представляет собой комбинированный результат системных и пользовательских переменных:

Путь строится из системного пути, который можно просмотреть в поле «Переменные среды системы» в диалоговом окне «Система». Путь пользователя добавляется к системному пути.

В статье также обсуждаются идентичные исключения для расширения переменных LibPath и Os2LibPath а также способы обработки указанных в autoexec.bat . Эти пункты, вероятно, найдут мало значения в сегодняшних типичных условиях.

Кредит на этот так ответ

1

Все, что Twisty Impersonator сказал в своем ответе , верно. Идея о добавлении пользовательской переменной пути была выделена, и я считаю, что последствия этого различия требуют некоторого дополнительного подхода.

Путь =% Путь% (Система); % Path% (Пользователь)

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

Например, чтобы запустить java , вы можете ввести любой из них:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

Первый пример использует полный путь. Это всегда будет использовать версию Java по этому точному пути.

Во втором примере будут проходить все каталоги в переменной среды %Path% поисках исполняемого файла с именем java.exe . Он запустит самый первый найденный и прекратит поиск. Если в java.exe есть два файла с именем %Path% , используется только первый найденный файл.

Третий пример, как и второй, будет перебирать каталоги, перечисленные в %Path% . Кроме того, поскольку расширение файла не было предоставлено, список исполняемых расширений файлов добавляется к имени файла в порядке, указанном в переменной среды %PATHEXT% . Если в java.com есть несколько файлов с именами java.exe , java.bat , %Path% и т.д., Используется только первый найденный файл .

Вы можете просмотреть список исполняемых расширений пути в вашей системе, создав следующий пакетный файл:

@echo off
echo %PATHEXT%
pause

На моей машине это:

,COM ;.EXE;.ЛЕТУЧАЯ МЫШЬ;.CMD ;.VBS ;.VBE ;.JS ;.JSE ;.WSF ;.WSH ;.MSC ;.PY

Что все это значит?

В отличие от других переменных среды, пользовательский путь не позволяет переопределить системный путь. Точно противоположный случай. Из приведенных выше примеров, есть много случаев, когда вы можете изменить версию Java по умолчанию. Однако, если в системном пути уже указана версия Java, именно эта версия ВСЕГДА будет найдена первой, поскольку путь ищется по порядку, слева направо, а путь пользователя добавляется справа. со стороны, с системным путем слева.

Что я могу с этим поделать?

Если у вас нет доступа к системным переменным среды, вы не можете переопределить программы по умолчанию в системном пути, используя путь пользователя. (Фактически, это должно быть так, иначе определенные программы перестанут работать правильно, и это откроет вашу систему для вмешательства вредоносного программного обеспечения. Никто не хочет этого.)

Вместо этого вы должны использовать полный путь, если вам нужна конкретная версия.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .