Я не знаю, почему вы проверить, если 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 /?
почему вы 'Гото SETPATH' в первой ветви, но только' EOF' без денется в другое отделение? –
@ LưuVĩnhPhúc этот командный файл вызывается из другого командного файла, поэтому, если путь существует, этот командный файл будет завершен, и родительский пакетный файл, из которого он был вызван, возобновит его работу. Поэтому я собираюсь в EOF в этом файле если путь существует, если он не установит путь. – n00b
нет, EOF не является допустимой командой, и вы получите сообщение об ошибке. Если вы хотите пойти на ярлык EOF, используйте 'goto EOF' –