Пакетный скрипт для set env. Запустите переменную OC4J и удалите env. переменная
На локальном компьютере установлены клиент Oracle (11.2.0) и сервер OC4J (контейнеры Oracle для J2EE 10g (10.1.3.5.0) (сборка 090727.2000.36696)), оба они используют ORACLE_HOME
переменная окружения, поэтому мне нужно установить ORACLE_HOME
указывает на папку сервера только при запуске сервера
Я пытаюсь создать командный файл, который должен сделать:
- Установить переменную среды
ORACLE_HOME
- Запустите сервер OC4J
- Отозвать
ORACLE_HOME
переменная
Я пытаюсь с этим сценарием, но третье утверждение никогда не выполняется.
call setx -m ORACLE_HOME "C:\Servers\oc4j_extended_101350"
call C:\Servers\oc4j_extended_101350\bin\oc4j -start
call REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V ORACLE_HOME
Все эти команды прекрасно работают, выполняя индивидуально. Но на том же пакетном скрипте запуск OC4J "никогда" не заканчивается. Любая идея, как я могу сделать это работает?
Любая помощь будет оценена
1 ответ
Пакетный файл для запуска сервера Oracle просто нуждается в следующих 2 строках:
set "ORACLE_HOME=C:\Servers\oc4j_extended_101350"
C:\Servers\oc4j_extended_101350\bin\oc4j.exe -start
Вот и все, если oc4j.exe
не является консольным приложением, и поэтому командный процессор немедленно продолжает обработку командного файла после запуска oc4j.exe
в результате чего закрывается командный процесс.
В противном случае используйте:
set "ORACLE_HOME=C:\Servers\oc4j_extended_101350"
start "Oracle Server" C:\Servers\oc4j_extended_101350\bin\oc4j.exe -start
Почему это работает?
Windows автоматически создает копию всей таблицы окружения текущего процесса для нового процесса при создании нового процесса.
Для командного процесса, выполняющего командный файл ORACLE_HOME
устанавливается в таблице окружения, как указано в командном файле.
При запуске сервера Oracle эта таблица среды копируется Windows для сервера Oracle, включая ORACLE_HOME
как определено в настоящее время. То, что определено в реестре Windows, не имеет значения и не учитывается. Сервер Oracle не видит, если есть также ORACLE_HOME
установить вообще, и если да, то с каким значением для родительских процессов или других процессов, работающих параллельно.
Простой пример демонстрации управления таблицами среды в Windows.
- Откройте окно командной строки и введите
set x=Hello
, - Тип
set x
и вы видитеx=Hello
, - казнить
start
в результате открывается второе окно командной строки. - Введите в это второе окно командной строки
set x
и вы также отображаютсяx=Hello
, - Вернитесь в первое окно командной строки и запустите
set x=Hi
, - Введите в этом первом окне командной строки
set x
и вы видитеx=Hi
, Снова переключитесь во второе командное окно, введите
set x
и ты все еще видишьset x=Hello
,Этот второй командный процесс получил копию первого командного процесса. То, что сейчас изменилось в таблице окружения первого командного процесса, не видно для второго командного процесса.
Выполнить во втором командном окне
set x=Bye
и проверить это сset x
,Вернитесь в первое командное окно и введите
set x
,Это все еще вывод
x=Hi
потому что также родительский процесс не возвращает то, что дочерний процесс изменяет в своей копии таблицы среды.Переключитесь на второе командное окно и введите
set path=
удалить переменную окружения PATH из таблицы окружения этого процесса.- Выполнить еще раз
start
открыть из второго командного окна третье командное окно. Войти
set path
и вы видите толькоPATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
Что случилось с системой PATH?
Системный PATH, а также PATH, связанные с учетной записью пользователя, по-прежнему задаются в реестре Windows и формируют PATH для новых процессов, запускаемых из процесса Explorer на рабочем столе. Но в таблицах среды второго и третьего командного процесса больше нет переменной окружения PATH. Эти два процесса теперь должны работать без переменной окружения PATH. Конечно, для первого командного процесса и всех других запущенных процессов PATH все еще существует в своих таблицах среды.