2015-04-21 49 views
1

到目前爲止,我有一個哈希表,其中有2個值。現在下面的代碼,導出所有的獨特的行,並給我一個數字,該行在100個xml文件中被引用了多少次。這是一部分。需要添加測試引用的完整路徑

我現在需要找出哪個子文件夾中有xml文件,其中包含哈希表中引用的唯一行。這可能嗎?

$ht = @{} 
Get-ChildItem -recurse -Filter *.xml | Get-Content | %{$ht[$_] = $ht[$_]+1} 
$ht 

# To export to CSV: 
$ht.GetEnumerator() | select key, value | Export-Csv D:\output.csv 
+0

您只需要計數爲1的行的位置? – mjolinor

+0

其實那些有多個 – NobleMan

+1

所以,而不是一個計數,你想積累的文件路徑列表? – mjolinor

回答

0

要獲得文件路徑到您的輸出,您需要將其分配給第一個管道中的變量。

這是類似於你需要的東西嗎?

$ht = @{} 
Get-ChildItem -recurse -Filter *.xml | %{$path = $_.FullName; Get-Content $path} | % { $ht[$_] = $ht[$_] + $path + ";"} 

上面的代碼將在「配置行」 =「計數」的格式返回一個哈希表。

編輯:

如果您需要返回三個元素(獨特的路線,計數和它被發現的路徑數組)它變得更加複雜。這是一個將返回一個PSObject的數組的代碼。每個包含XML文件中唯一一行的信息。

$ht = @() 
$files = Get-ChildItem -recurse -Filter *.xml 
foreach ($file in $files) { 
    $path = $file.FullName 
    $lines = Get-Content $path 
    foreach ($line in $lines) { 
     if ($match = $ht | where {$_.line -EQ $line}) { 
      $match.count = $match.count + 1 
      $match.Paths += $path 
     } else { 
      $ht += new-object PSObject -Property @{ 
       Count = 1 
       Paths = @(,$path) 
       Line = $line } 
     } 
    } 
} 

$ht 

我相信它可以縮短和優化,但希望它足以讓你開始。

+0

Jan ..感謝您的回覆。當我運行你的代碼時,我得到這個錯誤。 – NobleMan

+0

無法將值「G:\ GPO Backup \ {00A82A8A-E303-4241-9C59-49DE137EBA07} \ gpreport.xml」轉換爲輸入 「System.Int32」。錯誤:「輸入字符串格式不正確。」 在線:1 char:88 + ... t $ path} | %{$ ht [$ _] = $ ht [$ _] + $ path +「;」} – NobleMan

+0

如果您將$ ht定義爲數組'$ ht = @()',則會出現該錯誤。在你的問題中,它被定義爲一個散列表「$ ht = @ {}'。 –

相關問題