有条不紊地删除PowerShell中的DataTable Row?

时间:2015-01-16 15:35:13

标签: .net powershell datatable

我正在尝试使用Powershell从.NET DataTable中删除少量行,基于我的列表。这是我的精简代码:

这是我的数据表声明:

$Global:dt = New-Object System.Data.Datatable
$dt.Columns.Add("Name")
$dt.Columns.Add("AccountID")

我知道我正在填充我的数据表。这是我的代码,我尝试并有条件地删除了一些东西:

$testname = "John Smith"

foreach ($id in $DeleteIDs)
{
     $dt.Select("Name = '" + $testname + "' AND AccountId = '" + $id + "'").Delete()
}  

我可能会发疯但我知道这在我第一次尝试时对我有效。但现在我收到以下错误:

Method invocation failed because [System.Data.DataRow[]] doesn't contain a method named 'Delete'.
At P:\My Documents\Scripts\myLoc\myScript.ps1:152 char:9
+         $dt.Select("Name= '" + $testname+ "' AND AccountId = '" + $id + "' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

这表示System.Data.DataRow不包含Delete方法。我知道这不是尝试。当我放置断点并运行$dt | gm时,我得到以下内容。

 PS C:\WINDOWS\system32>> $dt | gm


   TypeName: System.Data.DataRow   

2 个答案:

答案 0 :(得分:1)

有两种方法可以从数据表中删除行:

  1. 使用$dataTable.Rows.Remove($row)(或RemoveAt())方法,该方法直接删除

  2. 使用$row.Delete(),可将行的状态更改为“已删除”。循环后,您必须调用dataTable.AcceptChanges()以确保有效删除这些行

可以从here找到来自Microsoft的解释确切的文档。

答案 1 :(得分:0)

感谢@ arco444,我能够确定我遇到的问题。而且我并不疯狂。

我想要删除的数据集不断变化。

当它正确运行时,在我搜索$testname的地方,整个数据集中只有该名称的一个实例。

今天当我运行脚本时,那里有$testname的多个实例,所以它将它作为一个行数组。以下修正了一切:

foreach ($id in $DeleteIDs)
{
     $rows = $dt.Select("Name = '" + $testname + "' AND AccountId = '" + $id + "'").Delete()

     foreach($row in $rows)
     {
          row.Delete()
     }
}  

变量将存储指向每一行的指针数组,因此我可以手动浏览每一行并删除它。