2012-08-01 126 views
2

我正在开发供应商应用程序的部署脚本。它读取映射各种环境的部署路径的xml,然后遍历各种服务器并将正确的文件复制并执行该转出脚本。如果转出脚本失败,我希望脚本退出。部署脚本是一个perl脚本,我需要先调用.bat来设置一堆环境变量。我已经发行的所有与&的串成这些命令,你可以看到下面,使得系统变量env.bat文件集仍然可用perl脚本运行时:Powershell调用命令脚本返回码

$cmdString = $destDrive + ": & call "+$lesDestDir+"data\env.bat & cd "+$rolloutDir+" & perl ..\JDH-rollout-2010.pl "+$rollout+" NC,r:\les" 
write-host "cmdString: " $cmdString 
Invoke-Command -session $session -ScriptBlock {cmd /v /k `"$args[0]`"} -args $cmdString 

的调用命令如下像这样用变量代换:

Invoke-Command -session $session -scriptblock {cmd /k "D: & call D:\XXXX\env.bat & cd D:\XXXX\RO-00102 & perl ..\JDH-rollout-2010.pl RO-00102 NC,r:\les"} 

所以,问题是我怎么可以从Perl脚本(这是在cmd中的上下文中运行的命令字符串中的最后一个命令)的返回码返回到本地机器在哪里运行脚本?对于我的方法,任何其他建议都是受欢迎的,因为我的PowerShell经验有限。

+0

是否有一个原因,你是从cmd而不是Powershell设置环境变量? – SpellingD 2012-08-01 14:32:38

+0

是的,它是供应商提供的脚本,每个环境都有所不同。我不想将它们的脚本转换为PowerShell,然后负责维护脚本,如果脚本发生变化。 – 2012-08-01 14:44:18

回答

0

我很快找到了解决方案。我添加返回代码,以我的$ cmdString的回声,然后使用调用命令返回远程变量回本地实例,然后我询问的返回码结果:

$cmdString = $destDrive + ": & call "+$lesDestDir+"data\env.bat & cd "+$rolloutDir+" & perl ..\JDH-rollout-2010.pl "+$rollout+" NC,r:\les & echo ExitCode:!errorlevel!" 
write-host "cmdString: " $cmdString 

Invoke-Command -session $session -ScriptBlock {$res = cmd /v /k `"$args[0]`"} -args $cmdString 
$res = Invoke-Command -session $session {$res}  
Write-Host "Return code: " $res  
$res = [string] $res   
$exitCode = $res.substring($res.IndexOf("ExitCode:"), 10)  
Write-Host "Exit code: " $exitCode