2016-06-27 9 views
0

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

@echo off 
echo %machine% > c:\machineoutput.txt 
findstr /I /c:"C:\Oracle\Ora12c\perl\bin" c:\machineoutput.txt 
if %errorlevel% == 0 (
    goto SETPATH 
) else (
    EOF 
) 
:SETPATH 
setx /m machine "%oracle_home%\perl\bin;%path%" 
:EOF 
exit 

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

Пожалуйста, помогите мне в выяснении того, что я делаю неправильно.

+1

почему вы 'Гото SETPATH' в первой ветви, но только' EOF' без денется в другое отделение? –

+0

@ LưuVĩnhPhúc этот командный файл вызывается из другого командного файла, поэтому, если путь существует, этот командный файл будет завершен, и родительский пакетный файл, из которого он был вызван, возобновит его работу. Поэтому я собираюсь в EOF в этом файле если путь существует, если он не установит путь. – n00b

+0

нет, EOF не является допустимой командой, и вы получите сообщение об ошибке. Если вы хотите пойти на ярлык EOF, используйте 'goto EOF' –

ответ

0

Я не знаю, почему вы проверить, если C:\Oracle\Ora12c\perl\bin существует в Нестандартные переменной окружения machine, чтобы определить, является ли %oracle_home%\perl\bin должен быть добавлен к системной переменной среды PATH . Предлагаю проверить систему PATH на наличие этого пути к каталогу.

EOF недействительна. Поэтому командный процессор Windows выводит сообщение об ошибке и продолжает следующую строку командной строки: setx. Вот почему ваш пакетный код не работает. Команда в ELSE ответвление должно быть goto :EOF.

Намного лучше будет следующий код, который проверяет, если %oracle_home%\perl\bin или его эквивалент расширен существует в системе PATH и присоединяет вместо препендов оно в системе PATH, если не существует в системе PATH.

@echo off 
if not exist "%oracle_home%\perl\bin\*" goto :EOF 
setlocal EnableExtensions DisableDelayedExpansion 

for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
     set "SystemPath=%%P" 
     goto CheckPath 
    ) 
) 
echo Error: System environment variable PATH not found. 
echo. 
endlocal 
pause 
goto :EOF 

:CheckPath 
setlocal EnableDelayedExpansion 
set "Separator=" 
set "PathToAdd=%%oracle_home%%\perl\bin" 
set "OraclePerlPath=%oracle_home%\perl\bin" 
if not "!SystemPath:~-1!" == ";" set "Separator=;" 
if "!SystemPath:%PathToAdd%=!" == "!SystemPath!" (
    if "!SystemPath:%OraclePerlPath%=!" == "!SystemPath!" (
     %SystemRoot%\System32\setx.exe PATH "!SystemPath!%Separator%%PathToAdd%" /M 
    ) 
) 
endlocal 
endlocal 

Для получения дополнительной информации об этой партии считанного кода ответа на Why are other folder paths also added to system PATH with SetX and not only the specified folder path? используется в качестве шаблона для этого командного кода. Он также объясняет, почему пакетный код, о котором идет речь, определенно не очень хорош.

Примечание: Команды Setx по умолчанию не доступен на Windows XP.

Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /? и reg query /?
  • set /?
  • setlocal /?
  • setx /?