我有一个脚本可以从日志文件列表中提取一些值。 每个值都插入一个数组中。
在脚本结束时,我想组合每个数组的每一行并将它们导出到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
欢迎提出任何建议,
提前谢谢。
答案 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
######### Fichier log du jour #################< ------------------ ----------------------------一个修饰语$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 ";"