2017-04-23 1 views
2

Je souhaite créer un Hashtable qui regroupe des fichiers du même nom dans des tableaux afin que je puisse ensuite travailler avec ceux-ci pour lister certaines propriétés de ces fichiers, comme les dossiers dans lesquels ils sont stockés .Ajout d'objets à un tableau dans une table de hachage

$ht = @{} 
gci -recurse -file | % { 
    try{ 
     $ht.Add($_.Name,@()) 
     $ht[$_.Name] += $_ 
    } 
    catch{ 
     $ht[$_.Name] += $_ 
    } 
} 

Tout ce que je reçois est:

Index operation failed; the array index evaluated to null. 
At line:8 char:13 
+    $ht[$_.Name] += $_ 
+    ~~~~~~~~~~~~~~~~~~ 

Je ne sais pas pourquoi cela ne fonctionne pas, je vous en serais reconnaissant toute aide.

+0

'si (ht $ [$ _ nom.]) {Ht $ [$ _ nom.] + = $ _} else {$ ht [$ _. nom] =, $ _} ' – wOxxOm

Répondre

2

Ne pas réinventer la roue. Vous voulez groupe fichiers avec le même nom, utilisez la Group-Object cmdlet:

$groupedFiles = Get-ChildItem -recurse -file | Group-Object Name 

Maintenant, vous pouvez facilement récupérer tous les noms de fichiers qui sont présents au moins deux fois en utilisant l'applet de commande Where-Object:

$groupedFiles | Where-Object Count -gt 1 

Vous obtenez cette erreur car si votre code atteint le bloc catch, la variable de pipeline actuelle ($_) représente la dernière erreur et pas l'élément actuel. Vous pouvez corriger cela soit stocker l'élément en cours d'une variable, ou si vous utilisez le paramètre cmdlet avancé -PipelineVariable:

$ht = @{} 
gci -recurse -file -PipelineVariable item | % { 
    try{ 
     $ht.Add($item.Name,@()) 
     $ht[$item.Name] += $item 
    } 
    catch{ 
     $ht[$item.Name] += $item 
    } 
}