Arrays 通过多个数组组合同一行的每个元素
我有一个脚本,可以从日志文件列表中提取一些值。 每个值都插入到一个数组中 在脚本的最后,我想合并每个数组的每一行,并将它们导出到excel文件中 以下是脚本: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
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 ";"