【问题标题】:Try Catch failing to obtain variablesTry Catch 获取变量失败
【发布时间】:2020-02-03 09:11:57
【问题描述】:

我有通过 CSV 导入的变量。但是,当我尝试从 foreach 循环(通过 CSV 解析)中运行以下 try/catch 时,会删除 ID 变量。如果我在 foreach 中运行其中一个语句(没有 try/catch),这将按预期工作。

#Send Emails
try {

    Send-ToEmail -email "$($_.EmailAddress)";

    #Set Success Status
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.Connection = New-Object System.Data.SqlClient.SqlConnection
    $SqlCmd.Connection.ConnectionString = $ConnectionString
    $SqlCmd.Connection.Open()
    $SqlCmd.CommandText = "UPDATE STATUSES SET STATUS = 2 WHERE ID = $($_.ID)"
    $SqlCmd.ExecuteNonQuery()

}

catch {
    "Failure Sending Email"

    #Set failure Status
    Echo "Updating Email Queue"
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.Connection = New-Object System.Data.SqlClient.SqlConnection
    $SqlCmd.Connection.ConnectionString = $ConnectionString
    $SqlCmd.Connection.Open()
    $SqlCmd.CommandText = "UPDATE STATUSES SET STATUS = 3 WHERE ID = $($_.ID)"
    $SqlCmd.ExecuteNonQuery()

}

【问题讨论】:

  • catch 内,$_ 自动变量保存错误本身,不是原始对象。在try..catch 之前创建一个变量,例如$user = $_,并在try 和catch 块中使用该变量而不是$_
  • 嗨@Theo,这是有道理的。可以举个例子吗?我尝试了 Boxdog 的类似建议,但没有奏效。
  • 如果您可以显示单步执行 CSV 文件的外部循环,将会很有帮助。另外,您如何阅读 CSV 文件?您在使用 Import-CSV 吗?为什么需要 SQLCmd?
  • 如果在 try 和 catch 块中都缺少 ID,那么您正在使用的 CSV 文件有问题。您确定该列的标题称为ID(它周围没有空格或其他什么?)输入几个Write-Host cmdlet,以便您可以在每次迭代中检查是否有您期望的值。

标签: powershell try-catch


【解决方案1】:

catch 块内,$_ 变量用于保存异常记录。尝试将您的管道对象分配给一个单独的变量并在catch 中引用它。例如:

$csvContent |
  Foreach-Object {
    $currentObject = $_

    try {
      # Do stuff
    }
    catch {
      # More stuff
      $SqlCmd.CommandText = "UPDATE STATUSES SET STATUS = 3 WHERE ID = $($currentObject.ID)"
      # Even more stuff
    }
  }

【讨论】:

  • 或者,使用传统的 foreach 循环。 foreach ($csvElement in $csvContent){}
  • 不幸的是 ID 变量仍然显示为空白
【解决方案2】:

它不起作用,因为 $_ / $PsItem 变量从管道中获取值。所以删除$_。部分变量。

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多