在变量上存储不同的位置编号

时间:2019-08-12 20:18:04

标签: powershell

我已将此输出写入文本文件:

DataStore_Checksum.txt:65:esentutl : ERROR: page 3401 checksum failed
DataStore_Checksum.txt:69:    + CategoryInfo          : NotSpecified: (ERROR: page 3401 checksum failed:String) [], RemoteException
DataStore_Checksum.txt:73:ERROR: page 6131 checksum failed
DataStore_Checksum.txt:74:ERROR: page 6357 checksum failed

我需要存储每个校验和失败的页码。在这种情况下,[3401, 6131, 6357]

我尝试使用两种方法:

ToString().Split(' ')[2]
'\d pattern matches

但是页码的行内容位置在每一行上都不同。出于某种原因,\d语法不适用于Select-String-Split

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

模式\d是一种语法有效的正则表达式,可以与Select-String一起使用,但是由于所需的数字始终被相同的文本模式包围,即:

ERROR: page #NUMBER# checksum failed

您最好使用Select-String来捕获上下文中所有连续数字

$pageNumbers = Select-String 'ERROR: page (\d+) checksum failed' -Path .\file.txt -AllMatches |ForEach-Object {
    # grab the (\d+) capture group
    $_.Match.Groups[1].Value
} |Sort-Object -Unique    # filter out duplicates

答案 1 :(得分:0)

假设可以将整个输入文件加载到内存中,以更简洁的方式补充Mathias R. Jessen's helpful answer

[regex]::Matches((Get-Content -Raw file.txt), '(?<=\bERROR: page )\d+').Value
  • [regex]::Matches()在指定正则表达式的输入字符串中查找所有匹配项。

  • 负向后断言(?<=\bERROR: page )查找字符串ERROR: page而不在每个匹配项中包含它,因此匹配项仅包含页码(\d+)。

  • 在所有匹配项上访问.Value属性,然后仅返回页码数组(作为字符串)。

上面的代码会产生一个常规的PowerShell数组([object[]]),其中包含所有页码:

3401
3401
6131
6357

如果需要消除重复项:

  • 如果重复项总是分组在一起,请将上述命令通过管道传递到| Get-Unique

  • 如果未将它们分组 ,则通过管道传递到| Select-Object -Unique

  • 如果要在排除重复的情况下按页码进行排序,请像Mathias的回答一样,将其输送到
    | Sort-Object -Unique