Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 通过多个数组组合同一行的每个元素_Arrays_Powershell - Fatal编程技术网

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

Arrays 通过多个数组组合同一行的每个元素,arrays,powershell,Arrays,Powershell,我有一个脚本,可以从日志文件列表中提取一些值。 每个值都插入到一个数组中 在脚本的最后,我想合并每个数组的每一行,并将它们导出到excel文件中 以下是脚本: while (1) { clear $list = New-Object System.Collections.ArrayList $list2 = New-Object System.Collections.ArrayList $list3 = New-Object System.Collections

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

在脚本的最后,我想合并每个数组的每一行,并将它们导出到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
欢迎任何建议


提前谢谢。

我想我会给你一个如何创建自定义对象的示例,我一直在报告中使用它,发现它非常简单,而且帮助很大

在下面的示例中,我使用Get-WMIOObject获取物理驱动器的列表,然后将该列表传递给Select Object,然后仅从out-put中选择所需的值

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

默认情况下,WMI以字节为单位输出自由空间,我希望以GB为单位,因此我创建了所谓的计算属性。我把自由空间值除以1GB,得到gigs,这是一个有很好证明的技巧

我还希望显示我运行报告的时间,但是没有时间属性,所以我在本例中创建了一个

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

您可以做一些类似于日志的事情,将每个条目添加到这样的自定义对象中,然后访问它

代码


我想与您分享我的修改,我知道它并不完美,但它对我很有用:

清楚的

$list=新对象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 IMHO,您需要重新编写它来创建自定义对象,而不是ArrayList。那你就有适合出口的东西了。这些东西是无价的。我的问题解决了。我对脚本做了很多修改,现在效果很好。谢谢你,你不想和世界分享你的解决方案?PS菲舍尔日志听起来很美味
$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|   
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 ";"