有条件地删除 powershell 中的 DataTable 行?

Conditionally delete DataTable Row in powershell?

我正在尝试根据我拥有的列表,使用 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 方法。我知道这不是尝试。当我放置断点和 运行 a $dt | gm 时,我得到以下信息。

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


   TypeName: System.Data.DataRow   

感谢@arco444,我能够查明我遇到的问题。而且我没疯。

我试图从中删除的数据集不断变化。

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

今天当我 运行 脚本时,那里有多个 $testname 实例,所以它把它当作一个行数组。以下修复了所有问题:

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

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

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

有两种方法可以从 DataTable 中删除行:

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

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

Microsoft 的文档对此进行了准确的解释 here