Regex Powershell:对日志上的foreach应用多个查询

Regex Powershell:对日志上的foreach应用多个查询,regex,powershell,Regex,Powershell,我需要从多个日志文件中获取传输的总数据值。数据值显示在字节行的total列下 它还分别用g、m、t或k分隔,以显示gb/mb/tb/kb Total Copied Skipped Mismatch FAILED Extras Bytes : 54.414 g 54.414 g 0 0 0 0 目前,我有一个脚本,它可以遍历所有文件并提取字节:和g之间的值,但我需要能够添加更多查询并

我需要从多个日志文件中获取传输的总数据值。数据值显示在字节行的
total
列下

它还分别用
g
m
t
k
分隔,以显示gb/mb/tb/kb

           Total    Copied   Skipped  Mismatch    FAILED    Extras
Bytes :  54.414 g  54.414 g         0         0         0         0
目前,我有一个脚本,它可以遍历所有文件并提取
字节:
g
之间的值,但我需要能够添加更多查询并添加到`foreach文件中,并将它们全部相加为一个一致的值

这是我目前拥有的,但只输出kb

$pattern = "(?<=.*Bytes :.*)\w.+?(?= g.*)"
$pattern1 = "(?<=.*Bytes :.*)\w.+?(?= m.*)"
$pattern2 = "(?<=.*Bytes :.*)\w.+?(?= k.*)"

Get-ChildItem "C:\Users\logs" -Filter "BFR*" | ForEach-Object { 
    Get-Content "C:\Users\logs\*.log" | where-Object {$_ -match $pattern } | ForEach-Object {
        [double] ($matches[0])
    } | Measure-Object -Sum | Select-Object -ExpandProperty sum
} | ForEach-Object {
    Get-Content "C:\Users\logs\*.log" | where-Object {$_ -match $pattern1 } | ForEach-Object {
        [double] ($matches[0])
    } | Measure-Object -Sum | Select-Object -ExpandProperty sum
} | ForEach-Object {
Get-Content "C:\Users\logs\*.log" | where-Object {$_ -match $pattern2 } | ForEach-Object {
        [double] ($matches[0])
    } | Measure-Object -Sum | Select-Object -ExpandProperty sum
}
$pattern=“(?这里有一种可能性。(对不起@JamesC,这是一个单行:-):

获取子项。\LogFolder\*.log|
ForEach对象{$totalBytes=0}{
获取内容$|选择字符串模式“^Bytes\s+:\s+(?\d+\.\d+([tgmk]).*$”
Foreach对象{
$size=$\.Matches.Groups[1]。值
开关($\ 0.Matches.Groups[2].Value)
{
t{$totalbytes+=(1tb*$size)}
g{$totalbytes+=(1gb*$size)}
m{$totalbytes+=(1mb*$size)}
k{$totalbytes+=(1kb*$size)}
}
}
}{“总字节:$totalBytes”}

我在你的代码中添加了缩进,因为它以前是不可读的。我们知道管道很酷,但有时一行不是最好的选择。当一行包含6个foreach
和3个Get Content时,你可能会猜到分解是个好主意!嘿@boxdog我喜欢这个方法,but在测试正则表达式模式时,它在文件中找不到任何东西。您建议对模式进行任何重新格式化以使其工作吗?我将您发布的示例直接复制到一个文本文件中,效果很好。您的示例是否与实际文件完全相同?您可能需要对其进行调整,以获得不完全相同的空格等。啊对不起,您是对的,日志文件在这一行上面包含了更多的信息,但这样做“^.*字节\s+:\s+(?\w+\.\w+([tgmk]).$”
Get-ChildItem .\LogFolder\*.log |
    ForEach-Object {$totalBytes = 0}{
        Get-Content $_ | Select-String -Pattern "^Bytes\s+:\s+(?<size>\d+\.\d+) (?<units>[tgmk]).*$" | 
            Foreach-Object {
                $size = $_.Matches.Groups[1].Value

                switch ($_.Matches.Groups[2].Value)
                {
                    t {$totalbytes += (1tb * $size)}
                    g {$totalbytes += (1gb * $size)}
                    m {$totalbytes += (1mb * $size)}
                    k {$totalbytes += (1kb * $size)}
                }
            }
    } {"Total Bytes: $totalBytes"}