【问题标题】:Powershell invoke-command script return codePowershell 调用命令脚本返回码
【发布时间】:2012-08-01 12:55:58
【问题描述】:

我正在为供应商应用程序编写部署脚本。它读取映射各种环境的部署路径的 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 经验有限,欢迎对我的方法提出任何其他建议。

【问题讨论】:

  • 您是否有理由从 cmd 而不是 Powershell 设置环境变量?
  • 是的,它是供应商提供的脚本,每个环境都不同。我不想将他们的脚本转换为 powershell,然后在他们的脚本发生变化时负责维护。

标签: perl powershell cmd invoke-command


【解决方案1】:

我很快就找到了解决方案。我在 $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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2016-07-02
    • 2016-09-09
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多