Показать полную графическую версию : Добавления значения к уже существующей системной переменной
Всем привет. Хочу чтобы у меня одно значение дописавалось к уже существующей переменной, например системная переменная Path, которая имеет значение C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Python26\;%SystemRoot%\system32;.................... т.д и т.п и нужно добавить значение C:\ProgramFiles(x86)\Autodesk\AutoCAD 2014\ (чтобы другие не удалялись) где в просторах нашел но мне кажется его поправить и убрать все лишнее. Если кому не сложно можете показать или убрать в этом коде что надо что не надо.За ранее спасибо.
rem какой путь нужно дописать в переменную Path
Set InstPath=%ProgramFiles%\Autodesk\AutoCAD 2014\
Set sw="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Set w7=
rem проверка версии (Windows 7) установленной системы
Ver | Find "6.1" >Nul && Set w7=1
rem извлечение текущего содержимого переменной Path
rem !ВАЖНО! - в кач-ве разделителя в первом цикле используется пробел, а во втором нужно указать
rem только символ табуляции (ASCII-код символа после знака "равно" в выделенном фрагменте должен быть 09)
If Defined w7 (
For /F "tokens=3* delims= " %%j In ('Reg Query %sw% /v Path') Do Set curPath=%%j %%k
) Else (
For /F "tokens=3 delims= " %%j In ('Reg Query %sw% /v Path') Do Set curPath=%%j
)
rem проверка наличия дописываемого значения в переменной Path (для исключения дублирования)
rem если дописываемого пути нет в переменной Path, то дополняем ее. Вообщем теперь в переменную Path он !допишет! значение C:\Program Files\Autodesk\AutoCAD 2014\
Echo "%curPath%" | Find /I "%InstPath%" >Nul || Reg Add %sw% /v Path /t REG_EXPAND_SZ /d "%curPath%;%InstPath%" /f
@pause
termitt, не хотите просто взять «SetX.exe» и не мучаться?
Существуют некоторые опасения в использовании команды "SETX" в данном случае: "Исправить переменную PATH - Batch (CMD_BAT) - CyberForum.ru (http://www.cyberforum.ru/cmd-bat/thread674821.html)". Но подтвердить или опровергнуть их не могу: экскр экспериментировать не хочется.
Я поэкспериментировал ;).
Сразу не соглашусь с:
Правда SetX есть только в системах >= Windows Server 2003.
Он идёт в комплекте Resource Kit'ов.
И это неверное утверждение:
Не используйте SetX для присвоения значения переменной Path.
Это неверный способ, т.к. переменная будет создана по адресу:
HKEY_CURRENT_USER\Environment\Path
что хоть и перекроет системную переменную HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
но остальные приложения, которые будут записывать новые пути в правильное расположение Path уже будут недоступные.
Достаточно просто добавить параметр «-m» (по крайней мере, так в моей версии).
Проблема, как я теперь вижу, совсем в другом: как получить простым способом текущее значение «Machine» PATH, т.е. из HKLM? Переменная окружения PATH нам не гожа — она ведь представляет собой слияние обеих переменных PATH — из Machine (HKLM) и User (HKCU) разделов. Т.е., либо мы опять возвращаемся к «reg.exe» с его различным выводом в разных версиях ОС, либо… понимаем, что пора переходить на WSH/PoSH ;).
Пометил предыдущий пост, как некорректный. Во всяком случае, пока некорректный.
Foreigner
13-01-2015, 15:33
Это неверный способ, т.к. переменная будет создана по адресу:
HKEY_CURRENT_USER\Environment\Path
что хоть и перекроет системную переменную HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
но остальные приложения, которые будут записывать новые пути в правильное расположение Path уже будут недоступные.
Пользовательская PATH (в HKCU\Environment) только дополняет системную, но не переписывает:
> echo %path% | sed "s/;/\n/g"
C:\Users\user\BIN\CONEMU
C:\Users\user\BIN\CONEMU\ConEmu
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86
C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64
C:\Users\user\BIN
C:\Users\user\BIN\GNU\BIN
C:\Users\user\BIN\SYSINTERNALS
C:\Program Files (x86)\Java\jre7\bin
> reg query hkcu\environment /v path | sed -r -ne "/REG/ s/(.*REG_.+\s+)(.*)/\2/" -e "s/;/\n/pg"
%USERPROFILE%\BIN
%USERPROFILE%\BIN\GNU\BIN
%USERPROFILE%\BIN\SYSINTERNALS
%ProgramFiles(x86)%\Java\jre7\bin
Пользовательская PATH (в HKCU\Environment) только дополняет системную, но не переписывает: »
Я бы сказал — перекрывает значения перечисленных путей.
извините быть может я тут многих не понял. но суть тут не в переменной Path . цель моя просто дописывать (дополнять) через точку с запятой любые значения переменной и в любой переменной будь это path или blalbla и т.д и т.п . может мне кто предложит поменьше код или проще есть вариант. или ваще оставить как есть!!
суть тут не в переменной Path »
Как раз в ней и суть. Ибо надо не просто присвоить значение, а добавить. Причём только единожды.
На WSH:
Option Explicit
Dim strPath4Add
Dim objWshShell
Dim strPaths
Dim strPath
Dim boolFound
strPath4Add = "C:\ProgramFiles(x86)\Autodesk\AutoCAD 2014"
Set objWshShell = WScript.CreateObject("WScript.Shell")
strPaths = Trim(objWshShell.Environment("SYSTEM").Item("PATH"))
If Len(strPaths) <> 0 Then
boolFound = False
For Each strPath In Split(strPaths, ";")
If StrComp(strPath, strPath4Add, vbTextCompare) = 0 Then
boolFound = True
Exit For
End If
Next
If Not boolFound Then
strPaths = strPaths & ";" & strPath4Add
objWshShell.Environment("SYSTEM").Item("PATH") = strPaths
Else
WScript.Echo "Path [" & strPath4Add & "] already present in PATH environment variable in SYSTEM collection."
End If
Else
WScript.Echo "Can't find PATH environment variable in SYSTEM collection."
WScript.Quit 1
End If
Set objWshShell = Nothing
WScript.Quit 0
termitt, может, имеет смысл вместо прямого пути в «C:\ProgramFiles(x86)\Autodesk\AutoCAD 2014» использовать переменную окружения?!
дописывать (дополнять) через точку с запятой любые значения переменной и в любой переменной будь это path или blalbla и т.д и т.п . »
Я не припомню ничего «другого», окромя PATHEXT :lol:.
Foreigner
13-01-2015, 17:37
termitt,
@echo off
setlocal
set "regpath=hkcu\environment"
for /f "tokens=3*" %%i in ('reg query "%regpath%" /v "path"') do call:add %%i %%j
goto:eof
:add
reg add "%regpath%" /v "path" /d "%*;C:\test" -f
2Foreigner:
1. Нужен HKLM, а не HKCU.
2. В HKCU может и не быть PATH.
3. Опять-таки, разные разделители в разных ОС у «reg.exe»; в старых ОС нет параметра «-f», а есть «/f».
4. Во второй раз будет два «C:\test», в третий — три. И т.д.
разные разделители в разных ОС у «reg.exe» »
Для "FOR" и символ табуляции является разделителем по умолчанию: for /f "tokens=1-3" %%i in ("A B C") do @echo %%i %%j %%k.
Georgio, значит, я ошибся.
Код:
@echo off
setlocal
set "regpath=hkcu\environment"
for /f "tokens=3*" %%i in ('reg query "%regpath%" /v "path"') do call:add %%i %%j
goto:eof
:add
reg add "%regpath%" /v "path" /d "%*;C:\test" -f »
не работает..
Foreigner
14-01-2015, 07:11
termitt, Скажи конкретный ключ. У меня приведенный батник работает.
Foreigner, я в этом не силен. слегка не понял..
Foreigner
14-01-2015, 08:40
termitt, В какой существующий ключ реестра необходимо дописать значение? Попробуй такой вариант с проверкой на наличие ключа:
@echo off
setlocal
set "key=hkcu\environment"
set "parameter=PATH"
set "value=C:\Test"
1>nul 2>&1 reg query "%key%" /v "%parameter%" || (
reg add "%key%" /v "%parameter%" /d "%value%"
goto:eof
)
for /f "tokens=3*" %%i in ('reg query "%key%" /v "%parameter%"') do call:add %%i %%j
:: shutdown /l (отлогин) для применения изменений
goto:eof
:add
reg add "%key%" /v "%parameter%" /d "%*;%value%" /f
Соответственно значения переменных key, parameter и value даны в качестве примера.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment вот сюда должна записать то есть hklm
Foreigner
14-01-2015, 09:04
termitt, Ну так подставьте свои значения.
Foreigner, @echo off
setlocal
set "key=hklm\environment"
set "parameter=PATH"
set "value=C:\Test"
1>nul 2>&1 reg query "%key%" /v "%parameter%" || (
reg add "%key%" /v "%parameter%" /d "%value%"
goto:eof
)
for /f "tokens=3*" %%i in ('reg query "%key%" /v "%parameter%"') do call:add %%i %%j
:: shutdown /l (отлогин) для применения изменений
goto:eof
:add
reg add "%key%" /v "%parameter%" /d "%*;%value%" /f
вот этот код добавил ничего нету. смотрю системную переменную Path ничего нету пусто отсутствует папка C:\test .
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.