使用invoke-command调用.bat文件进行Powershell错误处理

时间:2014-08-25 14:20:07

标签: windows powershell

我正在尝试使用TRY-CATCH块来捕获我用来调用另一台服务器上的远程.bat文件的invoke命令的错误。

如果.bat文件失败(它在本地SQL服务器上执行SP以运行备份),我希望Powershell知道.bat文件有错误并进入我的CATCH块。

但是,如果.bat文件失败,则不会捕获错误。如果对.bat文件的调用失败(因为我的目的是将其重命名为不存在的东西),它仍然不会进入我的CATCH块。

我错过了什么?

$scriptblock = {\\RemoteServerA\run.bat}
   try
   {
      Invoke-command –ComputerName $TargetComp -ScriptBlock $scriptblock -Credential $cred
   }
   catch
   {
      send-mailMessage -to "me@mail.ca" -subject "Remote .bat file failed" -from "you@mail.ca" -body ".bat file failed" -SmtpServer "smtp.me.ca" -credential $cred
   }

我甚至尝试使用if ... else块,通过这种方式它更好一些。如果对.bat文件的调用失败,则会失败,因为我将其重命名为不存在的内容。但是,如果.bat文件的内容失败(即SP失败),它将无法识别该失败,但看起来它看到对.bat文件的调用成功,并且没有失败。

这是一组更完整的代码,因为我的目标是在远程服务器上成功完成第一批文件后在远程服务器上执行第二批文件。

Invoke-command –ComputerName $TargetComp –ScriptBlock $scriptblock -Credential $cred

if ($? -eq "True")
   {Invoke-command –ComputerName $TargetComp –ScriptBlock $scriptblock2 –credential $cred
   $output2 = $?

   if ($output2 -eq "True")
      {send-mailMessage -to "me@mail.ca" -subject "Backup Successful" -from "me@mail.ca" -body "Yippee" -SmtpServer "smtp.me" -credential $cred
      Write-Host "Backup Successful"
      }
   else {send-mailMessage -to "me@mail.ca" -subject "BackupDB failed" -from "me@mail.ca" -body "BackupDB failed" -SmtpServer "smtp.me" -credential $cred
      Write-Host "Backup Failed" + $output2
      }
   }
else {send-mailMessage -to "me@mail.ca" -subject "DatabaseCheckDB failed" -from "me@mail.ca" -body "DatabaseCheckDB failed" -SmtpServer "smtp.me" -credential $cred}

2 个答案:

答案 0 :(得分:1)

其他选择是像这样handel:
调用Try,Catch和Finally的脚本。

$scriptblock = {
    Try {
        $strErrorMessage = $null
        $strTrace = $null

        $strTrace += "Start work"
        #Do Work
        $strTrace += "Work ended with LASTEXITCODE: '$LASTEXITCODE '"

    }
    Catch {
        $strErrorMessage = "Work Failed. Error: $($($error[0].ToString()) $($error[0].InvocationInfo.PositionMessage))"
    }
    Finally {
        $objReturnData = "" | Select-Object -Property strErrorMessage, strTrace
        $objReturnData.strErrorMessage = $strErrorMessage
        $objReturnData.strTrace = $strTrace
    }
    Return $objReturnData
}


并像这样调用它:

$objReturnData = Invoke-command –ComputerName $TargetComp -ScriptBlock $scriptblock -Credential $cred


然后返回结果。

$objReturnData.strTrace
$objReturnData.strErrorMessage 


现在,您可以使用If / Else查看作业是否失败。

答案 1 :(得分:0)

感谢大家的快速帮助,我想我正在思考我的想法。

基本上我的远程服务器上有2个.bat文件,每个文件都调用一个存储过程。

现在,我将尝试不同的方法,而不是直接调用SP,而不是调用.bat文件。成功完成第一个SP后,请拨打第二个SP。如果没有,则失败并发送电子邮件。