Редактирование переменной Path из командной строки без прав администратора
Если максимально кратко суть вопроса, то команда setx path "путь;%PATH%"
в командной строке без прав администратора работает неправильно. Требуется найти обходной путь или альтернативу этой команды, работающую без прав администратора.
Теперь подробно:
В общем, парочка приложений(в частности gcc компилятор) лежат на флешке, но для корректной работы требуется занести некоторые пути в переменную path. По задумке я должен вставить флешку в любой пк и одним открытием батника добавить все переменные куда надо и спокойно делать свои дела. Конечно, можно и ручками всё сделать, но так лучше.
В чем проблема: Известный факт, что переменные path есть пользовательские и системные.
Команда setx path
редактирует пользовательскую переменную path, если добавить флаг /M
, то можно редактировать системную переменную. В хелпе и на форумах обычно примеры типа такого setx path "путь;%PATH%"
. По задумке код должен добавлять путь;
в начало пользовательской переменной path. Это работает, если применять права администратора. А без прав переменная %PATH% - это каша из пользовательских и системных путей(не уничтожаются дубли). Т.е банально склеенные пользовательские и системные пути. Таким образом, при каждом применении такого участка кода в пользовательскую переменную path дополнительно вливаются системные переменные, которые, естественно, дублируются и быстро множатся.
немного экспериментов с переменной %PATH%:
Добавил в начало и конец пользовательской и системной переменных соответствующие значения и вывожу построчно(без прав администратора)
C:\Users\TestW10>echo %path:;=&echo.%
SystemBegin <-- это часть системной переменной
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
SystemEnd <-- и это
userBegin <-- это часть пользовательской переменной
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
userEnd <-- и это
Именно в таком порядке у меня и лежат переменные в графическом интерфейсе.
Теперь тоже самое, но с правами администратора:
C:\Windows\system32>echo %path:;=&echo.%
SystemBegin
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
SystemEnd
userBegin
userEnd
Становится ощущение, что %PATH% с правами администратора только убирает дубли, повторяющиеся в пользовательской переменной. Проверим еще. Добавил парочку дублирующихся переменных
C:\Users\TestW10>echo %path:;=&echo.%
SystemBegin
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
userEnd <-- новая часть переменной внутри системной path
SystemEnd
userBegin
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
SystemEnd <-- новая часть переменной внутри пользовательской path
userEnd
Теперь тоже самое, но с правами администратора
C:\Windows\system32>echo %path:;=&echo.%
SystemBegin
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
userEnd <--
SystemEnd
userBegin
В итоге userEnd внутри системной переменной path появляется первым а userEnd внутри пользовательской переменной не дублируется. Аналогично для SystemEnd. Всё это подтверждает идею о том, что %PATH% с правами администратора выводит содержимое системной переменной path, после чего дополняет не дублирующимися значениями из пользовательской переменной path. В свою очередь %PATH% без прав администратора банально склеивает системные и пользовательские path, не разбирая дубли.
Проблема:
Естественно, команда setx path "путь;%PATH%"
с разными значениями %PATH%
ведет себя по разному. А именно, как и говорил выше, без прав администратора добавляет лишение значения, что при многократном использовании сразу засоряет переменную %PATH%. Каким образом, не имея прав администратора можно добиться правильной работы команды setx path "путь;%PATH%"
?