2014-12-03 71 views
0

我正在嘗試分析一組文本文件(MSFTP日誌),並對提交了錯誤憑據的IP地址進行計數。我想我已經解決了這個問題,除非我不認爲數組正在正確傳遞給函數。因此,如果相同的IP出現在多個日誌文件中,我會得到重複的條目。我究竟做錯了什麼?結合數組中的對象

Function LogBadAttempt($FTPLog,$BadPassesArray) 
    { 
    $BadPassEx="PASS - 530" 
    Foreach($Line in $FTPLog) 
     { 
     if ($Line -match $BadPassEx) 
      { 
      $IP=($Line.Split(' '))[1] 
      if($BadPassesArray.IP -contains $IP) 
       { 
       $CurrentIP=$BadPassesArray | Where-Object {$_.IP -like $IP} 
       [int]$CurrentCount=$CurrentIP.Count 
       $CurrentCount++ 
       $CurrentIP.Count=$CurrentCount 
       }else{ 
       [email protected]{"IP"=$IP;"Count"='1'} 
       $BadPass=New-Object -TypeName PSObject -Property $info 
       $BadPassesArray += $BadPass 
       } 
      } 
     } 
    return $BadPassesArray 
    } 
[email protected]() 
$FTPLogs = Get-Childitem \\ftpserver\MSFTPSVC1\test 
$Result = ForEach ($LogFile in $FTPLogs) 
    { 
    $FTPLog=Get-Content ($LogFile.fullname) 
    LogBadAttempt $FTPLog 
    } 
$Result | Export-csv C:\Temp\test.csv -NoTypeInformation 

結果看起來像......

Count IP 
7 209.59.17.20 
20 209.240.83.135 
18441 209.59.17.20 
13059 200.29.3.98 

,並希望它的條目結合起來,209.59.17.20

+0

因此,您有一個密鑰,即IP地址。在將新對象添加到陣列之前,您可以查找該鍵。如果找到它,檢索計數,用新值增加它,然後轉到下一輪。 – 2014-12-03 19:37:18

+0

這就是我試圖用if($ BadPassesArray.IP-contain $ IP)部分。當我在處理同一個日誌文件時,它工作正常。當它進入下一個日誌文件時,就像它爲該循環創建了一個新版本的數組,因爲它沒有看到具有相同IP值的對象,因此它啓動了一個新的版本。 – 2014-12-03 20:15:16

回答

3

你讓這個方式太複雜了。處理流水線中的文件並使用散列表計算每個IP地址的出現次數:

$BadPasswords = @{} 

Get-ChildItem '\\ftpserver\MSFTPSVC1\test' | Get-Content | ? { 
    $_ -like '*PASS - 530*' 
} | % { 
    $ip = ($_ -split ' ')[1] 
    $BadPasswords[$ip]++ 
} 

$BadPasswords.GetEnumerator() | 
    select @{n='IP';e={$_.Name}}, @{n='Count';e={$_.Value}} | 
    Export-Csv 'C:\Temp\test.csv' -NoType 
+0

的確我是。這工作完美(在添加一個s到$ BadPassword [$ ip] ++之後)。謝謝! – 2014-12-03 21:07:34