2

我正在为供应商应用程序编写部署脚本。它读取映射各种环境的部署路径的 xml,然后遍历各种服务器并复制正确的文件并执行推出脚本。如果推出脚本失败,我希望脚本退出。rollout 脚本是一个 perl 脚本,我需要先调用 .bat 来设置一堆环境变量。正如您在下面看到的那样,我已经发出了所有这些与 & 串在一起的命令,以便 env.bat 设置的系统变量在 perl 脚本运行时仍然可用:

$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 经验有限,因此欢迎对我的方法提出任何其他建议。

4

1 回答 1

0

不久之后我找到了解决方案。我在 $cmdString 中添加了返回码的回显,然后使用 invoke-command 将远程变量返回到本地实例,然后我询问了返回码的结果:

$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
于 2012-08-01T16:40:27.163 回答