2015-12-07 2 views
-2

У меня есть пакетный скрипт setEnv.bat, который устанавливает переменные окружения, такие как TEST_ENV, true.переменная среды Windows не установлена ​​при вызове из сценария Perl

Я называю этот пакетный скрипт внутри сценария Perl, как:

my $batch_cmd = "setEnv.bat"; 
system($batch_cmd); 

Я запустить скрипт на Perl из командной строки. Значение setEnv.bat задает переменную окружения. После завершения сценария Perl, если я сделаю set TEST, выход будет

Переменная среды TEST не определена.

Это означает, что переменная окружения теряется при завершении пакетного скрипта и выполнении в сценарии Perl.

Как это решить?

+5

Не странно. [Так работают подоболочки] (http://stackoverflow.com/questions/1552814/why-arent-a-batch-files-environment-variables-set-when-run-from-perl). Вы разрешаете это, устанавливая свою среду так, как хотите, прежде чем вы вызовете свой сценарий Perl или манипулируете '% ENV' в своем скрипте Perl. – mob

+0

Моя проблема в том, что у меня есть набор пакетных файлов, которые я не знаю, что они будут делать - одна из них может установить переменную среды, одна из которых может запускать исполняемый файл, поэтому в основном мой скрипт perl полностью не знает, что внутри пакетных файлов. Мой скрипт perl запускает пакетные файлы в последовательности. Другие командные файлы, исполняющие исполняемые файлы, выполняются нормально, только те, которые устанавливают переменные env, не работают - переменные env не установлены. Теперь кто-то может сказать, почему я не пишу командный файл, который запускает последовательность пакетных файлов - мне очень сложно писать партию, чем писать программу perl. – SomeDude

+0

Спасибо.Кажется, что переменные переменных «Определить переменные подпроцесса» - это именно то, что я ищу. И там нет конкретного ответа. Но теперь я понимаю, что программа perl не может изменить среду, в которой работает, если это не другая программа perl. но голосующий только ради того, что он не отступил должным образом, несправедливо. На самом деле описание проблемы так же просто, как это может быть, чтобы продемонстрировать проблему, с которой я столкнулся. – SomeDude

ответ

1

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

Если вы просто хотите быстро и грязный раствор, вы можете попытаться объединить команды с & &, что-то вроде:

system('setEnv.bat && doSomething.bat'); 

Это не идеально, но если вы не хотите тратить слишком много времени на нем он должен работать (BTW, & & должен работать как на Windows, так и на Unix).

+0

Это не сработает для моего использования. У меня есть не только пакетные скрипты, но и некоторые другие скрипты, которые я хочу запустить в последовательности. Они смешаны, и они должны быть в порядке. Но спасибо за ваше время. Я буду писать свои сценарии, используя perl-скрипт, прежде всего как утилиту, а не как контроллер (для запуска последовательности летучих мышей, exes и т. Д.). Мой контроллер будет командный файл. Я хочу, чтобы у Perl был некоторый API, который решает это. – SomeDude

+0

Это будет работать до тех пор, пока то, что вы пытаетесь запустить, может быть запущено как команда оболочки. «&&» является последовательным, что означает, что вторая команда не будет выполнена до тех пор, пока первая не будет завершена. Показания о том, какие другие скрипты вы используете (тип скриптов), были бы полезны в оказании помощи. – ChatterOne

0

Попробуйте с помощью модуля Windows, Perl ниже в сценарии Perl, чтобы установить переменные среды Windows:

Win32::AdminMisc::SetEnvVar 

Пример кода:

use Win32::AdminMisc; 

$name="Temp"; 
$val="C:/tmp"; 
SetEnvVar($name,$val); 

Это будет установить переменную окружения $ имя $ Вал, создавая $ name it, если этого не существует. Новое значение будет установлено глобально. Для получения дополнительной информации обратитесь к документации по SetEnvVar(). Книга «Win32 Perl Scripting: Руководство администратора» также ссылается на SetEnvVar().

HTH

+0

Это эквивалентно команде setx? – SomeDude

+0

Нет, это подпрограмма в модуле Perl (то есть пакет многоразового использования, определенный в библиотеке). После того, как вы включите модуль Perl (используйте Win32 :: AdminMisc;), вы вызовете эту подпрограмму (SetEnvFar) из своей программы Perl. Я немного обновил код примера, чтобы сделать его более понятным. Пожалуйста, дайте мне знать, если я могу помочь. – tale852150

+0

К сожалению, у меня нет этого модуля в моем наборе. Да, вы можете сказать, что я могу загрузить его с www.roth.net/, но я не могу установить стороннюю организацию, не пройдя много процессов в организации. Поэтому я пока не могу идти по этому пути. В любом случае, спасибо. – SomeDude

Смежные вопросы