Comment faire une boucle à travers un ensemble de données dans powershell?
 j'essaye une tâche "très" simple pour afficher 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 la 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?
3 réponses
L'évaluation de la chaîne PowerShell appelle ToString () sur L'ensemble de données. Pour évaluer des propriétés (ou 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 d'itérer à travers une collection ou un tableau sans avoir à en calculer la longueur.
Réécrite (et édité pour la compilation) -
foreach ($Row in $ds.Tables[1].Rows)
{ 
  write-host "value is : $($Row[0])"
}
voici un exemple pratique (construisez 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
}
l'analyseur a du mal à concaténer votre chaîne. Essayez ceci:
write-host 'value is : '$i' '$($ds.Tables[1].Rows[$i][0])
Edit: utiliser des guillemets doubles pourrait aussi être plus clair puisque vous pouvez inclure les expressions dans la chaîne de caractères Citée:
write-host "value is : $i $($ds.Tables[1].Rows[$i][0])"