Команда вызова Powershell и системные переменные

Я работаю над автоматизацией исправлений для приложения поставщика. Я хотел использовать powershell для перебора списка серверов и использования удаленного взаимодействия для установки на каждом компьютере. Тем не менее, один аспект вызывает у меня большую головную боль. Я должен вызвать сценарий cmd, предоставленный поставщиком, для установки системных переменных перед выполнением сценария установки. Поэтому я вызываю скрипт в powershell так:

Invoke-Command -session $session {cmd /k ($args[0]+"\data\env.bat")} -Args $lesDestDir

Я вижу, как он выполняется, поскольку он повторяет свою работу в моем окне powershell, но последующие вызовы сценария установки, т.е.:

Invoke-Command -session $session {perl ".\rollout-2010.pl " $args[0] " NC"} -Args $rollout

немедленно выйти, говоря, что различные системные переменные, которые он использует, не были установлены. Может ли кто-нибудь объяснить мне область действия системных переменных? Они перестают существовать после завершения команды вызова? Нужно ли мне объединять два вызова сценария в одну команду вызова, чтобы второй сценарий мог получить доступ к системным переменным или что-то в этом роде?


person Justin Holbrook    schedule 29.07.2012    source источник


Ответы (2)


Изменения, внесенные с помощью команды SET, НЕ являются постоянными, они применяются только к текущему процессу cmd и остаются в силе до завершения процесса cmd.

Если возможно, установите переменную среды, используя синтаксис powershell:

Invoke-Command -session $session {$env:myvar = 1}

В качестве альтернативы вы можете ввести команды, используя разделитель команд cmd &, например:

Invoke-Command -session $session {cmd /k "set myvar = 1" `& "set"}
person jon Z    schedule 29.07.2012
comment
Может быть, я что-то упускаю, но не должно ли следующее эхо выводить значение 1 тогда: Invoke-Command -session $session {cmd /k set myvar=1 `& echo %myvar%} Это не производит вывода. - person Justin Holbrook; 29.07.2012
comment
Расширение переменной происходит при чтении команды (до ее установки в вашей команде). Чтобы отложить раскрытие переменной, добавьте переключатель /v при вызове cmd.exe и используйте ! вместо %: Invoke-Command -session $session {cmd /v /k set mytar=2 & echo !mytar!} - person jon Z; 29.07.2012
comment
Спасибо за примеры и понятное объяснение. Я смог выполнить то, над чем работал. - person Justin Holbrook; 30.07.2012

Да, вам нужно связать их вместе. Переменные окружения устанавливаются в первом завершающемся сеансе cmd, затем запускается второй без них.

person Mike Shepard    schedule 29.07.2012