web-dev-qa-db-fra.com

Comment parcourir un ensemble de données dans PowerShell?

J'essaie une tâche "très" simple pour sortir les valeurs de chaque ligne à partir d'un DataSet:

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

donne une sortie ...

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] 

Comment puis-je obtenir la valeur réelle de la colonne?

25
Murtaza Mandvi

L'évaluation de chaîne PowerShell appelle ToString () sur le DataSet. Pour évaluer des propriétés (ou des appels de méthode), vous devez forcer l'évaluation en enfermant l'expression dans $()

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

De plus, foreach vous permet de parcourir une collection ou un tableau sans avoir à déterminer la longueur.

Réécrit (et édité pour la compilation) -

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

Voici un exemple pratique (créez un ensemble de données à partir de votre emplacement actuel):

$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"] est un objet que vous pouvez manipuler comme n'importe quel autre objet Powershell:

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

L'analyseur a du mal à concaténer votre chaîne. Essaye ça:

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

Edit: L'utilisation de guillemets doubles peut également être plus claire car vous pouvez inclure les expressions dans la chaîne entre guillemets:

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