Установить переменные окружения по пакетному файлу, вызываемому из скрипта - PullRequest
0 голосов
/ 06 сентября 2018

Давайте рассмотрим следующий скрипт на Perl:

#!/usr/bin/perl
system("C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/Common7/Tools/VsDevCmd.bat");
system("msbuild");

Пакетный файл, вызванный первым вызовом system, должен установить некоторые переменные среды, чтобы можно было найти исполняемый файл msbuild во втором вызове system.

Когда я запускаю этот Perl-скрипт, я получаю следующую ошибку:

msbuild не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

Таким образом, похоже, что переменные среды, установленные в пакетном файле, не доступны для контекста сценария perl. Что я могу сделать, чтобы сделать эту работу?

Примечание 1

Запуск сначала командного файла из окна консоли, а затем запуск msbuild работает нормально. Таким образом, пакетный файл работает, как ожидалось, и msbuild фактически доступен.

Примечание 2

Мой реальный скрипт на Perl намного длиннее. Этот пример представляет собой огромное упрощение, которое позволяет воспроизвести проблему. Поэтому я не могу легко заменить Perl-скрипт на командный файл, например.

Примечание 3

Самое смешное: я использую этот Perl-скрипт без проблем один или два года. И вдруг он перестал работать.

1 Ответ

0 голосов
/ 06 сентября 2018
  • У вашего процесса есть связанная среда, которая содержит такие вещи, как путь поиска.
  • Когда начинается подпроцесс, у нового процесса появляется новая отдельная среда, которая запускается как копия среды родительского процесса.
  • Любой процесс (включая подпроцессы) может изменить свою собственную среду. Однако они не могут изменить среду своего родительского процесса.
  • Запуск system() создает новую среду.

Поэтому, когда вы вызываете system() для настройки вашей среды, он запускает новый подпроцесс с новой средой. Ваша пакетная программа затем меняет эту новую среду. Но затем подпроцесс завершается, и его среда перестает существовать - принимая все изменения вместе с ним.

Вам необходимо запустить пакетный файл в родительском процессе перед запуском вашей Perl-программы.

...