Как перебрать набор данных в powershell? - PullRequest
25 голосов
/ 30 апреля 2009

Я пытаюсь выполнить «очень» простую задачу для вывода значений каждой строки из 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 ]

34 голосов
/ 30 апреля 2009

Оценка строки PowerShell вызывает ToString () для DataSet. Чтобы оценить какие-либо свойства (или вызовы методов), вы должны принудительно выполнить оценку, заключив выражение в $()

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])"
}
17 голосов
/ 03 мая 2009

Вот практический пример (создайте набор данных из вашего текущего местоположения):

$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 голосов
/ 30 апреля 2009

У парсера проблемы с конкатенацией вашей строки. Попробуйте это:

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

Редактировать: Использование двойных кавычек также может быть более понятным, поскольку вы можете включить выражения в строку в кавычках:

write-host "value is : $i $($ds.Tables[1].Rows[$i][0])"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...