通过多个数组组合同一行的每个元素

时间:2014-03-27 10:27:48

标签: arrays powershell

我有一个脚本可以从日志文件列表中提取一些值。 每个值都插入一个数组中。

在脚本结束时,我想组合每个数组的每一行并将它们导出到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 }

这些数组的输出是这样的(每行可能包含更多的值。为了这个问题,我只留下了四个值):

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

欢迎提出任何建议,

提前谢谢。

2 个答案:

答案 0 :(得分:0)

我想我会举例说明如何创建一个自定义对象,我总是将它用于报告,发现它很容易并且帮助完整。

在下面的示例中,我使用 Get-WmiObject 来获取物理驱动器列表,然后将列表传递给 Select-Object ,然后仅选择我想从外面看的价值。

结果是创建了 $ diskinfo ,其中包含许多对象,每个对象都有一个DeviceID,FreeSpace和Time属性。

默认情况下,WMI输出将FreeSpace放在我想要的GB字节中,所以我创建了所谓的计算属性。我把FreeSpace的值除以1GB来得到它(这是一个记录很好的技巧)

我还希望我能够显示报告的时间,但是没有Time属性,所以我在这种情况下创建了一个。

您可以在下面的示例中看到一个简单的循环来读出结果。

你可以做一些类似的循环,想一想你的日志,并将每个条目添加到这样的自定义对象,然后访问它。我已经找到了我所做的改进性能。

守则

$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

答案 1 :(得分: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 log du jour #################< ------------------ ----------------------------一个修饰语
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 ";"