【发布时间】: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-Hostcmdlet,以便您可以在每次迭代中检查是否有您期望的值。
标签: powershell try-catch