我正在尝试使用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
答案 0 :(得分:1)
有两种方法可以从数据表中删除行:
使用$dataTable.Rows.Remove($row)
(或RemoveAt()
)方法,该方法直接删除
使用$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()
}
}
变量将存储指向每一行的指针数组,因此我可以手动浏览每一行并删除它。