Возникли трудности с работой многострочного регулярного выражения Powershell - нет совпадений

Я сослался на несколько примеров, которые мне удалось найти, которые казались весьма уместными, но я все еще не могу заставить это работать.

Мой ввод выглядит следующим образом, из команды dhcp server stats, и я подтвердил, что $output определяется правильно со строками, которые выглядят следующим образом:

MIBCounts:
        Discovers = 63911.
        Offers = 3903.
        Delayed Offers = 0.
        Requests = 29199.
        Acks = 273080.
        Naks = 71.
        Declines = 0.
        Releases = 395.
        ServerStartTime = Tuesday, March 27, 2012 7:38:53 PM
        Scopes = 34.
        Scopes with Delay configured= 0.
        Subnet = 10.31.0.0.
                No. of Addresses in use = 203.
                No. of free Addresses = 40774.
                No. of pending offers = 0.
        Subnet = 10.32.3.0.
                No. of Addresses in use = 0.
                No. of free Addresses = 0.
                No. of pending offers = 0.
        Subnet = 10.32.100.0.
                No. of Addresses in use = 48.
                No. of free Addresses = 145.
                No. of pending offers = 0.
        Subnet = 10.32.101.0.
                No. of Addresses in use = 34.
                No. of free Addresses = 159.
                No. of pending offers = 0.

Так что я попробовал это, но не получил спичек:

$output=$(netsh -r myserver dhcp server show mibinfo)

$dhcp_regex=@"
(?s)Subnet = (\d\.\d\.\d\.\d)\.\W+
.*No\. of Addresses in use = (\d+)\.\W+
.*No\. of free Addresses = (\d+)\.\W+
"@

$dhcp_record= {
    @{
        subnet=$matches[0]
        inuse=$matches[1]
        free=$matches[2]
    }}


$output -match $dhcp_regex

$matches

Помощь приветствуется.

2 ответа

Попробуйте это для своей первой строки:

(?s)Subnet = (\d+\.\d+\.\d+\.\d+)\.\W*

Вы также хотите посмотреть на каждую строку отдельно:

$output | % { $_ -match $dhcp_regex }

# Добавить | Out-Null если вы не хотите, чтобы каждая строка печаталась на вашем экране.

$ матчей [1]

Изменить: вот более полный пример.

$dhcp_regex = 'Subnet = (\d+\.\d+\.\d+\.\d+)'
$dhcp_regex2 = 'in use = (\d+)'
$output | ? { $_ -match $dhcp_regex -or $_ -match $dhcp_regex2} | % { $Matches[1] }

Изменить: вот многострочный пример.

$dhcp_regex = '(?m)Subnet = (\d+\.\d+\.\d+\.\d+)\.\r\n.*in use = (\d+)'
$output | Out-String | % { $_ -match $dhcp_regex }
$matches

Полезный совет: http://www.vistax64.com/powershell/80160-powershell-regex-help.html

Редактировать: выглядит как (?m) на самом деле не нужно. Out-String это секретный соус.

Изменено регулярное выражение, которое вы предоставили, чтобы добавить дополнительный элемент данных.

$dhcp_regex='(?m)Subnet = (\d+\.\d+\.\d+\.\d+)\.\r\n.*in use = (\d+)\.\r\n.* free Addresses = (\d+)\.'

Это прекрасно работает сейчас - высоко ценится! Я могу потратить некоторое время, когда мне скучно (хе-хе), чтобы выяснить, каким нюансом то, что мы делали раньше, терпело неудачу.

Другие вопросы по тегам