Возникли трудности с работой многострочного регулярного выражения 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+)\.'
Это прекрасно работает сейчас - высоко ценится! Я могу потратить некоторое время, когда мне скучно (хе-хе), чтобы выяснить, каким нюансом то, что мы делали раньше, терпело неудачу.