web-dev-qa-db-ja.com

複数行の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
Kevin

代わりに、最初の行でこれを試してください。

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

また、各行を個別に確認することもできます。

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

#各行を画面に印刷したくない場合は、| Out-Nullを追加します。

$ matches [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は秘密のソースです。

3
northben

提供した正規表現を変更して、データ要素を追加しました。

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

これで問題なく動作します。退屈しているときは、以前やっていたことが失敗していたことを微妙な方法で発見するために、しばらく時間を費やすかもしれません。

1
Kevin