2012-07-29 155 views
1

我正在为供应商应用程序自动化修补程序。我想使用powershell遍历服务器列表,并使用远程处理在每个盒子上安装。但是,一方面让我很头痛。我必须在执行安装脚本之前调用供应商提供的cmd脚本来设置系统变量。因此,我调用脚本像这样在PowerShell中: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-command完成后它们是否停止存在?我是否需要将单个invoke-command中的两个脚本调用串在一起,以便第二个脚本可以访问系统变量或类似的东西?

回答

3

所做的更改。

如果有可能使用PowerShell的语法设置环境变量:

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

另外,您可以使用字符串cmd命令分离&这样的命令:

Invoke-Command -session $session {cmd /k "set myvar = 1" `& "set"} 
+0

也许我失去了一些东西,但不应该如下回显1的值: Invoke-Command -session $ session {cmd/k“set myvar = 1”'&“echo%myvar%”} 它不产生ou tput的。 – 2012-07-29 15:27:09

+1

读取命令时(在命令中设置之前)会发生变量扩展。要延迟变量的扩展,请在调用cmd.exe时添加/ v开关并使用!而不是%:Invoke-Command -session $ session {cmd/v/k“set mytar = 2&echo!mytar!”} – 2012-07-29 16:31:05

+0

谢谢你们的例子和清楚的解释。我能够完成我正在从事的工作。 – 2012-07-29 20:38:44

0

是的,你需要把它们串在一起。环境变量正在退出的第一个cmd会话中设置,然后第二个会在没有它们的情况下启动。使用SET命令被永久的,它们适用于当前cmd只是过程,并保持,直到cmd过程结束