Почему мой сценарий PowerShell не называет группы соответствия? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть небольшой скрипт PowerShell, который анализирует файлы журналов, чтобы извлечь определенные строки и перенести их в ArrayList.

[regex]$regex = "(?'datetime'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{1,3}[+-]\d{2}:\d{2}).*" #shortened for ease of understanding
$results = New-Object System.Collections.ArrayList
Get-ChildItem 'C:\debug-*.txt' | ForEach-Object {
    Get-Content $_ | Where-Object {$_ -match $regex} | ForEach-Object {
        $match = $regex.Match($_)
        $obj = New-Object psobject
        foreach ($group in $match.Groups) {
            if ($group.Name -ne "0") {
                $obj | Add-Member -NotePropertyName $group.Name -NotePropertyValue $group.Value
            }
        }
        $results.Add($obj)
    }
}

В моей разработке P C он работает на одном Windows 2012 Сервер работает, но на другом я получаю сообщение об ошибке, потому что $group.Name является нулевым. На этой машине никогда не существует свойства Name в группах Match.

Похоже, это было добавлено в. NET 1.1, но сервер Windows 2012, который поставляется с PowerShell 3.0 и . NET 4 установлено.

1 Ответ

0 голосов
/ 29 апреля 2020

Ответ заключался в том, чтобы структурировать l oop по-другому и использовать хеш-таблицу $Matches вместо Group объектов.

$tmp = $_ -match $regex
foreach ($match in $matches) {
    if ($match -ne "0") {
        $obj | Add-Member -NotePropertyName $match -NotePropertyValue $matches[$match]
    }
}

Мне не ясно, куда приходит $matches от, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...