2017-02-09 12 views
0

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

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

setx path C:\Program Files (x86)\MyApp\ 

Это добавляет к переменной пути, но когда я пытаюсь добавить еще один, он переписывает существующее значение, которое я добавил. Как этого избежать?

Как удалить путь к каталогу, который я добавил из переменной окружения?

ответ

0

Вы должны быть в состоянии использовать существующее значение это так:

setx PATH %PATH%;C:\Program Files (x86)\MyApp\ 

Чтобы удалить его, вероятно, можно сделать что-то вроде этого:

setx PATH=%PATH:;C:\Program Files (x86)\MyApp\=% 

Какой бы заменить путь это было не имея ничего, чтобы удалить его.

0

Необходимо проверить, является ли пользовательская часть переменной path пустой, например. для добавления каталога следующим образом:

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
set "_apppath=C:\Program Files (x86)\MyApp\" 

set "_keyBase=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager" machine 
set "_keyBase=HKCU"             user 

set "_dataTyp=" 
set "_dataOld=" 
for /F "tokens=2,*" %%G in (' 
    reg query "%_keyBase%\Environment" -V path ^| findstr /I "\<path\>" 
    ') do (
     set "_dataTyp=%%G" 
     set "_dataOld=%%H" 
) 
if defined _dataOld (
    set "_dataNew=%_apppath%;%_dataOld%" 
) else (
    set "_dataNew=%_dataOld%" 
    set "_dataTyp=REG_SZ" 
) 
rem debugging output: show script variables 
set _ 

if /I "%~1" EQU "write" (
    reg add "%_keyBase%\Environment" -V path -T %_dataTyp% -d "%_dataNew%" -F 
) else (
    rem debugging output 
    ECHO reg add "%_keyBase%\Environment" -V path -T %_dataTyp% -d "%_dataNew%" -F 
) 
ENDLOCAL 
goto :eof 

Обратите внимание, что я использую reg add вместо setx command. См. Также this Rojo's answer для исчерпывающего объяснения.

Выход.

d:\bat> D:\bat\SO\42140086.bat 
_apppath=C:\Program Files (x86)\MyApp\ 
_dataNew=C:\Program Files (x86)\MyApp\;D:\bare!;D:\Remote 
_dataOld=D:\bare!;D:\Remote 
_dataTyp=REG_EXPAND_SZ 
_keyBase=HKCU 
reg add "HKCU\Environment" -V path -T REG_EXPAND_SZ -d "C:\Program Files (x86)\MyApp\;D:\bare!;D:\Remote" -F 

d:\bat> D:\bat\SO\42140086.bat write 
_apppath=C:\Program Files (x86)\MyApp\ 
_dataNew=C:\Program Files (x86)\MyApp\;D:\bare!;D:\Remote 
_dataOld=D:\bare!;D:\Remote 
_dataTyp=REG_EXPAND_SZ 
_keyBase=HKCU 
The operation completed successfully. 

d:\bat> D:\bat\SO\42140086.bat 
_apppath=C:\Program Files (x86)\MyApp\ 
_dataNew=C:\Program Files (x86)\MyApp\;C:\Program Files (x86)\MyApp\;D:\bare!;D:\Remote 
_dataOld=C:\Program Files (x86)\MyApp\;D:\bare!;D:\Remote 
_dataTyp=REG_EXPAND_SZ 
_keyBase=HKCU 
reg add "HKCU\Environment" -V path -T REG_EXPAND_SZ -d "C:\Program Files (x86)\MyApp\;C:\Program Files (x86)\MyApp\;D:\bare!;D:\Remote" -F 

d:\bat> 

Над выходом показывает, что только проверить, если ключ пусто не хватает, как запустить его в два раза добавит тот же каталог, в два раза, а также.

Однако проверка того, что ключ path (пользовательский или машинный) содержит конкретный каталог, не является такой простой задачей. Например, некоторые записи в path содержат обратную косую черту \, а другие нет. Более того, некоторые записи в значении реестра pathREG_EXPAND_SZ могут быть запутаны в других переменных среды, например. %ProgramFiles%\SomeApp вместо C:\Program Files\SomeApp и т.д.

Следующий сложный сценарий может помочь проанализировать Windows path переменные окружения (обратите внимание, что он может показать неправильные значения, если путь содержит восклицательный знак ! из-за enabled delayed expansion):

@ECHO OFF 
SETLOCAL enableextensions enabledelayedexpansion 
echo --- %date% %time% %~nx0 %* 
if /I "%~1" EQU "dir" (
    set path 
    Call :printPath path "" dir 
    ENDLOCAL 
    goto :eof 
) 

set pathext 

Call :duplicity pathext 

Call :printPath path "" 

rem debugging set "wrongpath=%path%;%SystemRoot%\\" 
rem debugging Call :duplicity wrongpath 

Call :duplicity path 

set "HKCU_type=" 
set "HKCU_path=" 
for /F "tokens=2*" %%G in (
    'reg query HKCU\Environment /v Path 2^>NUL ^|findstr /I "path"' 
) do (
    set "HKCU_type=%%G" 
    set "HKCU_path=%%H" 
) 
Call :printPath HKCU_path %HKCU_type% 
if /I "%HKCU_type%"=="REG_EXPAND_SZ" Call :printPath HKCU_path %HKCU_type% Expanded 

set "HKLM_type=" 
set "HKLM_path=" 
set "qqqq=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
for /F "tokens=2*" %%G in ('reg query "%qqqq%" /v Path^|findstr /I "path"' 
) do (
    set "HKLM_type=%%G" 
    set "HKLM_path=%%H" 
) 
Call :printPath HKLM_path %HKLM_type% 
if /I "%HKLM_type%"=="REG_EXPAND_SZ" Call :printPath HKLM_path %HKLM_type% Expanded 

:dirOnly 
Call :deflatePath HKLM_path %HKLM_type% 
    rem echo "!NewPath:%%=%%%%!" 

pause 
set HK 
ENDLOCAL&call set "NewPath=%NewPath%" 
goto :eof 

:printPath 
echo(
echo %~0 %~1 %~2 %~3 
if "!%~1!" NEQ "" (
    set "ggg="!%~1:;=" "!"" 
    rem set "ggg=!ggg:\"="!" 
    for %%G in (!ggg!) do (
    if /I "%~3" NEQ "expanded" (
     if /I "%~3" EQU "dir" (
      echo(
      echo %~0 %~1 %~2 %%~G 
      set "_partpath=%%~G" 
      if /I "!_partpath:%SystemRoot%=!" EQU "%%~G" (
       dir /B /A:-D "%%~G" | findstr /I "%pathext:;=$ %$" 
       rem timeout /T 3 /NOBREAK >NUL 
      ) else (
       echo %~0 %~1 %~2 System default 
      ) 
     ) else (
      echo %%~G 
     ) 
    ) else (
     call echo %%~G 
    ) 
) 
    echo(
    echo tested using next findstr regex: 
    echo "%pathext:;=$ %$" 
) 
goto :eof 

:duplicity 
echo(
echo %~0 %~1 %~2 
set /A "ii=0" 
set "ggg="!%~1:;=" "!"" 
set "ggg=!ggg:\"="!" 
for %%G in (!ggg!) do (
    set /A "ii+=1" 
    set /A "jj=0" 
    for %%g in (!ggg!) do (
    set /A "jj+=1" 
    if /I "%%~G"=="%%~g" if !ii! LSS !jj! echo !ii!, !jj!: %%~g 
) 
) 
goto :eof 

:deflatePath 
echo(
echo %~0 %~1 %~2 
set "ggg="!%~1:;=" "!"" 
rem set "ggg=!ggg:\"="!" 
set "NewPath=" 
for %%G in (!ggg!) do (
    set "item=%%~G" 
    set "meti=" 
    call :deflateItem "ProgramFiles(x86)" 
    if defined meti (
    rem echo # !item! 
) else (
    call :deflateItem "ProgramFiles" 
    if defined meti (
     rem echo # !item! 
    ) else (
     call :deflateItem "SystemRoot" 
     if defined meti (
     rem echo # !item! 
    ) else (
     rem echo = !item:%%=%%%%! 
    ) 
    ) 
) 
    if defined NewPath (
    set "NewPath=!NewPath!;!item!" 
) else (
    set "NewPath=!item!" 
) 
) 
echo !NewPath! 
rem reg delete HKCU\Environment /v NewPath /f 
rem setx NewPath "!NewPath!" 
rem WARNING: The data being saved is truncated to 1024 characters. 
rem reg query HKCU\Environment /v NewPath|findstr /I "NewPath" 
goto :eof 

:deflateItem 
    set "meti=!%~1!" 
    if "!meti!"=="!item!" (
    set "item=%%%~1%%" 
) else (
    set "meti=!item:%meti%\=!" 
    if "!meti!" == "!item!" (
     set "meti=" 
    ) else (
     set "item=%%%~1%%\!meti!" 
    ) 
) 
goto :eof