0

日志文件包含:

=====
SMTP_server_not_set_up
@PANEL SMTP 服务器未设置。联系系统管理员。
@PAGECNT 381
@SCANADFCNT 0
@日期时间 2019-08-29T10:05:51-0400
@正常运行时间 0:00:23
@CODELVL

基础 MSNGM.053.023
发动机 GM.052.E015
面板 f0.12p48v3
@结尾
=====
上电复位
@PAGECNT 381
@SCANADFCNT 0
@日期时间 2019-08-29T10:05:50-0400
@色情49
@CODELVL

基础 MSNGM.053.023
发动机 GM.052.E015
面板 f0.12p48v3
@结尾
=====
Load_MP_Feeder_with_Custom_Type_5_Letter
@PANEL 使用自定义类型 5 字母加载 MP 进纸器
@PAGECNT 337
@SCANADFCNT 0
@日期时间 2019-08-29T09:59:22-0400
@正常运行时间 0:44:15
@CODELVL

基础 MSNGM.053.023
发动机 GM.052.E015
面板 f0.12p48v3
@结尾
=====

... 更多的行

我想抓住“=====”行之后的 6 行并将其转换为自定义对象。

例如,根据第一行,理想的对象是:

消息:SMTP_server_not_set_up
PANEL : @PANEL SMTP 服务器未设置。联系系统管理员。
PAGECNT:@PAGECNT 381
SCANADFCNT :@SCANADFCNT 0
日期时间:@DATETIME 2019-08-29T10:05:51-0400
正常运行时间:@正常运行时间 0:00:23

到目前为止,我可以像这样隔离重复出现的“=====”之后的那 6 行:

(Select-String -Path "$PSScriptRoot\$($printer)_history.log" -Pattern "=====" -Context 6).Context.PostContext

现在我需要将这些行放在自定义对象中。我真的不知道如何正确处理这个问题,我正在探索做这样的事情:

$ObjHistory = @()
(Select-String -Path "$PSScriptRoot\$($printer)_history.log" -Pattern "=====" -Context 6).Context.PostContext | ForEach-Object {
    if ($_ -match "PANEL") {
        $properties = [ordered]@{'PANEL'="$_"}
        $objet = New-Object -TypeName PSObject -Property $properties
    }

    $ObjHistory += $objet
}

$ObjHistory

这样我发现我可以成功地将 PANEL 属性放入自定义对象中,它输出:

控制板
-----
@PANEL SMTP 服务器未设置。联系系统管理员。
@PANEL 使用自定义类型 5 字母加载 MP 进纸器
@PANEL 使用自定义类型 5 字母加载 MP 进纸器
@PANEL 使用自定义类型 5 字母加载 MP 进纸器
@PANEL 使用自定义类型 5 字母加载 MP 进纸器

但是,我需要对其他线路执行此操作,并且我一直坚持如何处理它,因为ForEach-Object一次只有一条线路。

4

3 回答 3

1

提取的数据已经具有键/值类型的结构,因此您可以使用ConvertFrom-StringData将数据块转换为哈希表,然后再转换为自定义对象。

避免在循环中附加到数组。只需输出循环中的对象并将循环输出收集到一个变量中。

$path  = "${PSScriptRoot}\${printer}_history.log"

$objHistory = @(Select-String -Path $path -Pattern '=====' -Context 6 | ForEach-Object {
    $props = $_.Context.PostContext -replace '^[^@]', 'MESSAGE = $&' -replace '^@(\w+)', '$1 = $&' |
             Out-String |
             ConvertFrom-StringData
    New-Object -Type PSObject -Property $props
})

-replace '^[^@]', 'MESSAGE = $&'将不以 a开头的行添加@到字符串MESSAGE =,并在行的开头-replace '^@(\w+)', '$1 = $&'替换为。随后将数据块合并为单个字符串,否则将每行创建一个哈希表。@WORDWORD = @WORDOut-StringConvertFrom-StringData

于 2019-09-03T15:14:39.553 回答
1

不同的方法

  • 使用 -raw 参数读取登录
  • 分成===== 几个部分
  • 将部分拆分为行并将这些行存储到变量中以输出为[PSCustomObject]

编辑

  • 创建一个空[PSCustomObject]并使用正则表达式填充相关属性
    (如果需要,清除多余的@propname)
## Q:\Test\2019\09\03\SO_57773555.ps1
$RE = [regex]'^@(MESSAGE|PANEL|PAGECNT|SCANADFCNT|DATETIME|UPTIME) +(.*)$'
$Path = "$PSScriptRoot\$($printer)_history.log"

$ObjHistory = foreach($Section in ((Get-Content $Path -raw)  -split '===== ?\r?\n' -ne '')){
    $obj = [PSCustomobject]@{MESSAGE="";PANEL="";PAGECNT="";SCANADFCNT="";DATETIME="";UPTIME=""}
    $obj.MESSAGE = ($Section -split '\r?\n')[0]
    foreach($Line in ($Section -split '\r?\n')[1..5] ){
      if($Line -match $RE){
        $obj.($Matches[1])=$Matches[2] # to have the complete line =$Matches[0]
      }
    }
    $obj 
  }
$ObjHistory


> .\SO_57773555.ps1                                                                                                                 

MESSAGE    : SMTP_server_not_set_up
PANEL      : SMTP server not set up. Contact system administrator.
PAGECNT    : 381
SCANADFCNT : 0
DATETIME   : 2019-08-29T10:05:51-0400
UPTIME     : 0:00:23

MESSAGE    : PowerOnReset
PANEL      :
PAGECNT    : 381
SCANADFCNT : 0
DATETIME   : 2019-08-29T10:05:50-0400
UPTIME     :

MESSAGE    : Load_MP_Feeder_with_Custom_Type_5_Letter
PANEL      : Load MP Feeder with Custom Type 5 Letter
PAGECNT    : 337
SCANADFCNT : 0
DATETIME   : 2019-08-29T09:59:22-0400
UPTIME     : 0:44:15
于 2019-09-03T15:35:04.093 回答
1

拍摄了 convertfrom-string,基于示例的解析。多个示例效果更好。

$template = @'
=====
{message*:SMTP_server_not_set_up}
{panel:@PANEL  SMTP server not set up. Contact system administrator.}
{pagecnt:@PAGECNT  381}
{scanadfcnt:@SCANADFCNT 0}
{datetime:@DATETIME  2019-08-29T10:05:51-0400}
{uptime:@UPTIME  0:00:23}
@CODELVL

Base MSNGM.053.023
Engine GM.052.E015
Panel f0.12p48v3
@END
=====
{message*:PowerOnReset}
{pagecnt:@PAGECNT  381}
{scanadfcnt:@SCANADFCNT 0}
{datetime:@DATETIME  2019-08-29T10:05:50-0400}
@PORCNT  49
@CODELVL

Base MSNGM.053.023
Engine GM.052.E015
Panel f0.12p48v3
@END
=====
{message*:Load_MP_Feeder_with_Custom_Type_5_Letter}
{panel:@PANEL  Load MP Feeder with Custom Type 5 Letter}
{pagecnt:@PAGECNT  337}
{scanadfcnt:@SCANADFCNT 0}
{datetime:@DATETIME  2019-08-29T09:59:22-0400}
{uptime:@UPTIME  0:44:15}
@CODELVL

Base MSNGM.053.023
Engine GM.052.E015
Panel f0.12p48v3
@END
=====
'@

$testtext = @'
=====
SMTP_server_not_set_up
@PANEL  SMTP server not set up. Contact system administrator.
@PAGECNT  381
@SCANADFCNT 0
@DATETIME  2019-08-29T10:05:51-0400
@UPTIME  0:00:23
@CODELVL

Base MSNGM.053.023
Engine GM.052.E015
Panel f0.12p48v3
@END
=====
PowerOnReset
@PAGECNT  381
@SCANADFCNT 0
@DATETIME  2019-08-29T10:05:50-0400
@PORCNT  49
@CODELVL

Base MSNGM.053.023
Engine GM.052.E015
Panel f0.12p48v3
@END
=====
Load_MP_Feeder_with_Custom_Type_5_Letter
@PANEL  Load MP Feeder with Custom Type 5 Letter
@PAGECNT  337
@SCANADFCNT 0
@DATETIME  2019-08-29T09:59:22-0400
@UPTIME  0:44:15
@CODELVL

Base MSNGM.053.023
Engine GM.052.E015
Panel f0.12p48v3
@END
=====
'@

$testText | ConvertFrom-String -TemplateContent $template

输出:

message    : SMTP_server_not_set_up
panel      : @PANEL  SMTP server not set up. Contact system administrator.
pagecnt    : @PAGECNT  381
scanadfcnt : @SCANADFCNT 0
datetime   : @DATETIME  2019-08-29T10:05:51-0400
uptime     : @UPTIME  0:00:23

message    : PowerOnReset
pagecnt    : @PAGECNT  381
scanadfcnt : @SCANADFCNT 0
datetime   : @DATETIME  2019-08-29T10:05:50-0400

message    : Load_MP_Feeder_with_Custom_Type_5_Letter
panel      : @PANEL  Load MP Feeder with Custom Type 5 Letter
pagecnt    : @PAGECNT  337
scanadfcnt : @SCANADFCNT 0
datetime   : @DATETIME  2019-08-29T09:59:22-0400
uptime     : @UPTIME  0:44:15
于 2019-09-03T16:38:06.110 回答