Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Добавления значения к уже существующей системной переменной (http://forum.oszone.net/showthread.php?t=293831)

termitt 13-01-2015 10:08 2455287

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


Iska 13-01-2015 12:46 2455365

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

Georgio 13-01-2015 13:19 2455378

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

Iska 13-01-2015 14:33 2455407

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

Сразу не соглашусь с:
Цитата:

Правда 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 2455443

Цитата:

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


Iska 13-01-2015 16:47 2455505

Цитата:

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

Я бы сказал — перекрывает значения перечисленных путей.

termitt 13-01-2015 17:00 2455512

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

Iska 13-01-2015 17:30 2455532

Цитата:

Цитата 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 :lol:.

Foreigner 13-01-2015 17:37 2455541

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


Iska 13-01-2015 18:03 2455547

2Foreigner:

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

Georgio 13-01-2015 18:28 2455558

Цитата:

Цитата Iska
разные разделители в разных ОС у «reg.exe» »


Для "FOR" и символ табуляции является разделителем по умолчанию:
Код:

for /f "tokens=1-3" %%i in ("A        B        C") do @echo %%i %%j %%k
.

Iska 13-01-2015 23:23 2455683

Georgio, значит, я ошибся.

termitt 14-01-2015 03:18 2455739

спасибо за помощь

termitt 14-01-2015 05:48 2455751

Цитата:

Цитата Foreigner
Код:
@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 2455756

termitt, Скажи конкретный ключ. У меня приведенный батник работает.

termitt 14-01-2015 08:12 2455768

Foreigner, я в этом не силен. слегка не понял..

Foreigner 14-01-2015 08:40 2455771

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 даны в качестве примера.

termitt 14-01-2015 08:57 2455775

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment вот сюда должна записать то есть hklm

Foreigner 14-01-2015 09:04 2455777

termitt, Ну так подставьте свои значения.

termitt 14-01-2015 09:39 2455787

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 .

Foreigner 14-01-2015 15:00 2455936

Цитата:

Цитата termitt
hklm\environment »

Вообще-то если hklm, то hklm\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
Сами же говорили чуть ранее
Цитата:

Цитата termitt
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment вот сюда должна записать то есть hklm »

Проверить можно в regedit или в свойствах системы: Панель Управления > Система > Дополн. параметры системы > Переменные среды > Системные переменные > PATH

Либо перезагрузить компьютер

Код:

@echo off
setlocal

set "key=hklm\System\CurrentControlSet\Control\Session Manager\Environment"
set "parameter=path"
set "value=%ProgramFiles%\Autodesk\AutoCAD 2014"

1>nul 2>&1 reg query "%key%" /v "%parameter%" || (

    reg add "%key%" /v "%parameter%" /t reg_sz /d "%value%"
    goto:eof

)

for /f "tokens=3*" %%i in ('reg query "%key%" /v "%parameter%"') do call:add %%i %%j
goto:eof

:add
reg add "%key%" /v "%parameter%" /d "%*;%value%" /f

Батник должен быть запущен с повышенными привилегиями (от Администратора)

termitt 14-01-2015 17:40 2456058

Foreigner, хмм... дома сработала. сделал запуск от имени администратора. спасибо!!! завтра попробую на работе)

termitt 15-01-2015 09:01 2456258

Foreigner, да да все работает спасибо. а можно же сделать что смотрел на эту переменную проверил чтобы не было дублирования?

gora 15-01-2015 13:05 2456367

Цитата:

Цитата termitt
проверил чтобы не было дублирования? »

Код:

Set InstPath=%SystemDrive%\Program Files\7-Zip
Set sw="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
For /F "tokens=2*" %%j In ('Reg Query %sw% /v Path ^| Find /I "Path"') Do Set type=%%j& Set curpath=%%k
Echo "%curpath%" | Find /I "%InstPath%" >Nul && Exit
Reg Add %sw% /v Path /t %type% /d "%curpath%;%InstPath%" /f


termitt 15-01-2015 13:27 2456376

gora, да проверил дублируется создает второй раз, если запустить еще раз батник.

Iska 15-01-2015 14:50 2456429

termitt, какие-то религиозные соображения не позволяют пользовать WSH?!

termitt 16-01-2015 03:35 2456783

Iska, неее хотелось бы только командами batch

termitt 16-01-2015 04:07 2456786

Iska, и хватит навязывать мне тут свой whs!

Iska 16-01-2015 05:42 2456795

Цитата:

Цитата termitt
Iska, неее хотелось бы только командами batch »

Ясно. Значит, таки религия.

Цитата:

Цитата termitt
Iska, и хватит навязывать мне тут свой whs! »

Флаг Вам в руки.
И, да — он не мой.


Время: 03:51.

Время: 03:51.
© OSzone.net 2001-