Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Добавления значения к уже существующей системной переменной

Ответить
Настройки темы
CMD/BAT - Добавления значения к уже существующей системной переменной

Новый участник


Сообщения: 21
Благодарности: 1

Профиль | Отправить PM | Цитировать


Всем привет. Хочу чтобы у меня одно значение дописавалось к уже существующей переменной, например системная переменная 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

Отправлено: 10:08, 13-01-2015

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


termitt, не хотите просто взять «SetX.exe» и не мучаться?

Последний раз редактировалось Iska, 13-01-2015 в 14:32.


Отправлено: 12:46, 13-01-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Существуют некоторые опасения в использовании команды "SETX" в данном случае: "Исправить переменную PATH - Batch (CMD_BAT) - CyberForum.ru". Но подтвердить или опровергнуть их не могу: экскр экспериментировать не хочется.

Отправлено: 13:19, 13-01-2015 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Я поэкспериментировал .

Сразу не соглашусь с:
Цитата:
Правда 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 .

Пометил предыдущий пост, как некорректный. Во всяком случае, пока некорректный.

Отправлено: 14:33, 13-01-2015 | #4


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата:
Это неверный способ, т.к. переменная будет создана по адресу:
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

Отправлено: 15:33, 13-01-2015 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Пользовательская PATH (в HKCU\Environment) только дополняет системную, но не переписывает: »
Я бы сказал — перекрывает значения перечисленных путей.

Отправлено: 16:47, 13-01-2015 | #6


Новый участник


Сообщения: 21
Благодарности: 1

Профиль | Отправить PM | Цитировать


извините быть может я тут многих не понял. но суть тут не в переменной Path . цель моя просто дописывать (дополнять) через точку с запятой любые значения переменной и в любой переменной будь это path или blalbla и т.д и т.п . может мне кто предложит поменьше код или проще есть вариант. или ваще оставить как есть!!

Последний раз редактировалось termitt, 13-01-2015 в 17:07.


Отправлено: 17:00, 13-01-2015 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата termitt:
суть тут не в переменной 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» использовать переменную окружения?!

Цитата termitt:
дописывать (дополнять) через точку с запятой любые значения переменной и в любой переменной будь это path или blalbla и т.д и т.п . »
Я не припомню ничего «другого», окромя PATHEXT .

Отправлено: 17:30, 13-01-2015 | #8


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


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

Отправлено: 17:37, 13-01-2015 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


2Foreigner:

1. Нужен HKLM, а не HKCU.
2. В HKCU может и не быть PATH.
3. Опять-таки, разные разделители в разных ОС у «reg.exe»; в старых ОС нет параметра «-f», а есть «/f».
4. Во второй раз будет два «C:\test», в третий — три. И т.д.

Отправлено: 18:03, 13-01-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Добавления значения к уже существующей системной переменной

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Без раскрытия системной переменной окружения janxp Скриптовые языки администрирования Windows 11 09-02-2014 06:35
CMD/BAT - Присвоение значения переменной starav Скриптовые языки администрирования Windows 1 30-05-2013 09:23
VBS/WHS/JS - Вывод значения переменной в сообщение la_vanille_ciel Программирование и базы данных 3 09-04-2008 11:55
Как изменить заголовок в уже существующей теме ? XPurple О сайте и форуме 8 13-04-2005 07:24
php деление значения строковой переменной Guest Вебмастеру 4 14-10-2004 17:12




 
Переход