web-dev-qa-db-ja.com

PowerShellでデータセットをループする方法は?

私は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] 

列から実際の値を取得するにはどうすればよいですか?

25
Murtaza Mandvi

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])"
}
35
Steven Murawski

これが実用的な例です(現在の場所からデータセットを作成します):

$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
}
17
Shay Levy

パーサーが文字列の連結に問題があります。これを試して:

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

編集:二重引用符を使用すると、引用符で囲まれた文字列内に式を含めることができるため、より明確になる場合があります。

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