有条件地删除 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 中删除行:
用$dataTable.Rows.Remove($row)
(或RemoveAt()
)方法,直接删除行
和 $row.Delete()
,这会将行的状态更改为已删除。循环后,你必须调用dataTable.AcceptChanges()
以确保这些行被有效删除。
Microsoft 的文档对此进行了准确的解释 here。
我正在尝试根据我拥有的列表,使用 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 中删除行:
用
$dataTable.Rows.Remove($row)
(或RemoveAt()
)方法,直接删除行和
$row.Delete()
,这会将行的状态更改为已删除。循环后,你必须调用dataTable.AcceptChanges()
以确保这些行被有效删除。
Microsoft 的文档对此进行了准确的解释 here。