2017-04-23 128 views
2

我想創建一個Hashtable,它將數組中同名的文件分組,因此我可以在稍後與那些列出這些文件的某些屬性(如存儲它們的文件夾) 。將對象添加到哈希表中的數組

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

所有我得到的是:

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

我不知道這是爲什麼不工作,我會很感激的任何幫助。

+0

'如果($ HT [$ _名。]){$ HT [$ _名。] + = $ _} else {$ ht [$ _。name] =,$ _}' – wOxxOm

回答

2

不要重塑的車輪。你想文件具有相同的名稱,使用Group-Object的cmdlet:

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

現在你可以很容易檢索存在使用至少兩次Where-Object cmdlet的所有文件名:

$groupedFiles | Where-Object Count -gt 1 

您會收到此錯誤信息,因爲如果您的代碼碰到catch塊,則當前管道變量($_)代表上一個錯誤不是當前項目。您可以修復,通過兩種存儲當前項目的變量,或者您使用-PipelineVariable先進的cmdlet的參數:

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