如何在PowerShell中遍历数据集?

26

我正在尝试输出来自DataSet的每一行的值:

for ($i=0;$i -le $ds.Tables[1].Rows.Count;$i++)
{
  Write-Host 'value is : ' + $i + ' ' + $ds.Tables[1].Rows[$i][0]
}

提供了以下输出结果...

value is :  +0+ +System.Data.DataSet.Tables[1].Rows[0][0] 
value is :  +1+ +System.Data.DataSet.Tables[1].Rows[1][0] 
value is :  +2+ +System.Data.DataSet.Tables[1].Rows[2][0] 
value is :  +3+ +System.Data.DataSet.Tables[1].Rows[3][0] 
value is :  +4+ +System.Data.DataSet.Tables[1].Rows[4][0] 
value is :  +5+ +System.Data.DataSet.Tables[1].Rows[5][0] 
value is :  +6+ +System.Data.DataSet.Tables[1].Rows[6][0] 

我该如何从列中获取实际值?

3个回答

46

PowerShell字符串的求值是在DataSet上调用ToString()方法。为了评估任何属性(或方法调用),您必须通过将表达式括在$()中来强制进行求值。

for($i=0;$i -lt $ds.Tables[1].Rows.Count;$i++)
{ 
  write-host "value is : $i $($ds.Tables[1].Rows[$i][0])"
}

此外,foreach 允许你遍历集合或数组而不需要计算长度。

foreach ($Row in $ds.Tables[1].Rows)
{ 
  write-host "value is : $($Row[0])"
}

如果每行有多个列,我们如何访问特定的列值? - Ajay Meda

17

以下是一个实用的例子(根据您当前位置构建数据集):

$ds = new-object System.Data.DataSet
$ds.Tables.Add("tblTest")
[void]$ds.Tables["tblTest"].Columns.Add("Name",[string])
[void]$ds.Tables["tblTest"].Columns.Add("Path",[string])

dir | foreach {
    $dr = $ds.Tables["tblTest"].NewRow()
    $dr["Name"] = $_.name
    $dr["Path"] = $_.fullname
    $ds.Tables["tblTest"].Rows.Add($dr)
}


$ds.Tables["tblTest"]

$ds.Tables["tblTest"] 是一个对象,您可以像操作任何其他 Powershell 对象一样来操作它:

$ds.Tables["tblTest"] | foreach {
    write-host 'Name value is : $_.name
    write-host 'Path value is : $_.path
}

2
解析器在连接您的字符串时出现问题。请尝试以下方法:
write-host 'value is : '$i' '$($ds.Tables[1].Rows[$i][0])

编辑:使用双引号可能更清晰,因为您可以在引号内包含表达式:

write-host "value is : $i $($ds.Tables[1].Rows[$i][0])"

zdan - 关闭,但是你应该在整个字符串周围加上双引号(单引号不允许评估)。而且你不需要在字符串中添加额外的引号或反引号(很难确定它们是哪个)。 - Steven Murawski
评估是在单引号外执行的,并与带引号的字符串连接,这相当于将整个内容用双引号括起来。我同意这样会更清晰,但我想匹配他最初的问题。 - zdan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接