Пакетный скрипт для set env. Запустите переменную OC4J и удалите env. переменная

На локальном компьютере установлены клиент Oracle (11.2.0) и сервер OC4J (контейнеры Oracle для J2EE 10g (10.1.3.5.0) (сборка 090727.2000.36696)), оба они используют ORACLE_HOME переменная окружения, поэтому мне нужно установить ORACLE_HOME указывает на папку сервера только при запуске сервера

Я пытаюсь создать командный файл, который должен сделать:

  1. Установить переменную среды ORACLE_HOME
  2. Запустите сервер OC4J
  3. Отозвать 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.

  1. Откройте окно командной строки и введите set x=Hello,
  2. Тип set x и вы видите x=Hello,
  3. казнить start в результате открывается второе окно командной строки.
  4. Введите в это второе окно командной строки set x и вы также отображаются x=Hello,
  5. Вернитесь в первое окно командной строки и запустите set x=Hi,
  6. Введите в этом первом окне командной строки set x и вы видите x=Hi,
  7. Снова переключитесь во второе командное окно, введите set x и ты все еще видишь set x=Hello,

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

  8. Выполнить во втором командном окне set x=Bye и проверить это с set x,

  9. Вернитесь в первое командное окно и введите set x,

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

  10. Переключитесь на второе командное окно и введите set path= удалить переменную окружения PATH из таблицы окружения этого процесса.

  11. Выполнить еще раз start открыть из второго командного окна третье командное окно.
  12. Войти set path и вы видите только

    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    

Что случилось с системой PATH?

Системный PATH, а также PATH, связанные с учетной записью пользователя, по-прежнему задаются в реестре Windows и формируют PATH для новых процессов, запускаемых из процесса Explorer на рабочем столе. Но в таблицах среды второго и третьего командного процесса больше нет переменной окружения PATH. Эти два процесса теперь должны работать без переменной окружения PATH. Конечно, для первого командного процесса и всех других запущенных процессов PATH все еще существует в своих таблицах среды.

Другие вопросы по тегам