我正在为供应商应用程序开发部署脚本。它读取映射各种环境的部署路径的xml,然后遍历各种服务器并复制正确的文件并执行rollout脚本。如果rollout脚本失败,我希望脚本退出。 rollout脚本是一个perl脚本,我需要先调用.bat来设置一堆环境变量。我已经发布了所有与&'s串联的命令,如下所示,以便在perl脚本运行时env.bat设置的系统变量仍然可用:
$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命令看起来像这样,带有变量替换:
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 :(得分: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