2014-03-27 108 views
0

我有一個腳本從日誌文件列表中提取一些值。 每個值都插入到一個數組中。通過多個陣列合併同一行的每個元素

在腳本結尾,我想將每個數組的每一行組合起來,並將它們導出到一個excel文件中。

這裏是腳本:

while (1) { 
clear 
    $list = New-Object System.Collections.ArrayList 
    $list2 = New-Object System.Collections.ArrayList 
    $list3 = New-Object System.Collections.ArrayList 
    $list4 = New-Object System.Collections.ArrayList 
    $dir_to_look = "C:\test" 
    $30_days_backdate=$(Get-Date).Adddays(-30) ####pour tester 
    $contenu = Get-childitem $dir_to_look -recurse LOG20* |where { $_.lastwritetime -gt $30_days_backdate }| Get-Content 
############### Fichier log du jour 

    foreach ($line in $contenu) { 
     if ($line -match "CFTT82E.*IDT=(.+?)\b.*") { 

       $str = $line.Split(' ') 
       $props = [ordered]@{  
       Heure = $str[2] 
       Date = $str[1]  ############ Heure où le message est apparu ###################### 
            } 
     $heure_plantage=$str[2] 
     $date_du_plantage=$str[1]  


      $idt = $matches[1] 
       if(!$list.contains($idt)){ 
        if ($line -match "CFTT82E.*PART=(.+?)\b.*") { ############### Récuperrer le nom_du_partner ################# 
          $part = $matches[1] 

                   } 

        $list.add($idt) 
        $list2.add($heure_plantage) 
        $list3.add($part) 
        $list4.add($date_du_plantage) 
        $conver=$list4 |Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'} # conversion date en EU 



      } 
      } 


    } 
    ###visual test of the array values 
    write-host "$list" 
    write-host "$list2" 
    write-host "$list3" 
    write-host "$conver" 

    break } 

這些陣列的輸出是這個(可能包含更多的值在每個line.I只剩四個值爲這個問題的目的):

A1512201 A1512204 A1512203 A1512205 
12:20:06 12:20:08 12:20:16 12:20:25 
TOTO  TITI  DPFDDFL PACKA 
15-01-14 12-03-14 13-03-14 13-03-14 

所以,我想有正確的順序如下輸出:

DATE  HOUR   IDT  PARTNER 
15-01-14 12:20:06 A1812201  TOTO 
12-03-14 12:20:08 B1212204  TITI 
13-03-14 12:20:16 A1912203  DPFDDF 
13-03-14 12:20:25 A2012205  PACKA 

任何建議是歡迎,

預先感謝您。

+1

恕我直言,你需要重新編程,編寫這個來創建自定義對象而不是數組列表。那麼你會有一些適合輸出的東西。 – mjolinor

+0

雖然(1)是無價的。 – EBGreen

+0

我的問題解決了。我在腳本上做了很多修改,現在它可以正常工作。 謝謝 – user3364384

回答

0

我想我會給你一個如何創建一個自定義對象的例子,我一直使用這個報告,發現它很容易和幫助完整。

在下面的例子中我使用GET-WmiObject可以獲得驅動器是物理的名單,我則列表傳遞給選擇-對象,然後只選擇我從出來把想要的值。

結果是$ DISKINFO與數裏面的物體,每一個的DeviceID,可用空間和時間屬性的創建。

默認情況下,WMI輸出將FreeSpace以字節爲單位我希望它以GB爲單位,所以我創建了所謂的計算屬性。我把FreeSpace的值和1GB除以得到它在演出(這是一個很好的文件技巧)

我也想我運行報告的時間顯示,但沒有時間屬性,所以我創建了一個在這個案件 。

你可以在下面的例子中看到一個簡單的循環來讀出結果。

你可以做一些類似的循環思考你的日誌,並將每個條目添加到像這樣的自定義對象,然後訪問它。我發現在我做的事情中這種改進的性能。

$diskinfo = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | Select-Object DeviceID,@{Name="FreeSpace";Expression={$_.FreeSpace/1gb}},@{Name="Time";Expression={Get-Date -format yyyy.M.d.H.mm.ss}} 


Foreach ($disk in $diskinfo) 
{ Write-Host $disk.DeviceID" "$disk.FreeSpace " "$disk.Time 
0

我想與大家分享一下我修改的代碼,我知道這是不是完美的,但它爲我工作:

明確

$ list = New-Object System.Collections。ArrayList的

$dir_to_look = "C:\test" 
$30_days_backdate=$(Get-Date).Adddays(-30) ####pour tester 
Get-childitem $dir_to_look -recurse LOG20* |where { $_.lastwritetime -gt $30_days_backdate }| Get-Content| 
######### Fichier登錄大談特談################# < ------------ ---------------------------------- A modifier
ForEach-Object { 
$line = $_.Trim() 
    if ($line -match "CFTT82E.*IDT=(.+?)\b.*") { 



     $idt = $matches[1] 
      if(!$list.contains($idt)){ 
       if ($line -match "CFTT82E.*PART=(.+?)\b.*") { ############### Récuperrer le nom_du_partner ################# 
         $part = $matches[1] 

                  } 


       $props = [ordered]@{  
       Date = $_.Split(' ')[1]|Foreach-Object {$_ -replace "([0-9]+)/+([0-9]+)/+([0-9]+)", '$3-$2-$1'} 
       Heure = $_.Split(' ')[2] 
       IDT=$idt 
       PARTENAIRE=$part  
           } 
     New-Object PsObject -Property $props 
      } 




     } 

}|export-csv .\CFT_ERREURS-$(Get-Date -Format dd-MMMM-yyyy-HH-mm-ss).csv -notypeinformation -Delimiter ";" 
相關問題