Powershell invoke-command и системни променливи

Работя върху автоматизирането на корекции за приложение на доставчик. Исках да използвам 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

незабавно излезте, казвайки, че различните системни променливи, които използва, не са зададени. Може ли някой да ми обясни обхвата на системните променливи? Престават ли да съществуват след завършване на командата invoke? Трябва ли да съчетая двете извиквания на скрипта в една команда за извикване, така че вторият скрипт да има достъп до системните променливи или нещо подобно?


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