Многострочное регулярное выражение для захвата только последнего числа результатов не удается в powershell?

Я просто хочу получить последнее число всего, что возвращает ping:

$s = ping 129.69.1.153 | out-string
 $s
 if ( $s -match '(?m).+(\d+)ms' ) {
 $Matches
 }

Google сказал (? M) для многострочного и. + Должен быть как можно более жадным. Но то, что я получаю, это просто последний номер второй строки, а не последняя строка????

Ping wird ausgeführt für 129.69.1.153 mit 32 Bytes Daten:
 Antwort von 129.69.1.153: Bytes=32 Zeit=31ms TTL=51
 Antwort von 129.69.1.153: Bytes=32 Zeit=26ms TTL=51
 Antwort von 129.69.1.153: Bytes=32 Zeit=27ms TTL=51
 Antwort von 129.69.1.153: Bytes=32 Zeit=25ms TTL=51

 Ping-Statistik für 129.69.1.153:
 Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
 (0% Verlust),
 Ca. Zeitangaben in Millisek.:
 Minimum = 25ms, Maximum = 31ms, Mittelwert = 27ms

 match: ..
 Name Value 
 ---- ----- 
 1 31 
 0 Antwort von 129.69.1.153: Bytes=32 Zeit=31ms

Даже

$s.Replace("'n","").Replace("'r","")

после пинга и перед совпадением совпадает только мс второй строки?

Любая идея, как простой запрос можно решить простым способом?

Спасибо за ваши ответы, но, обманывая себя, я увлекаюсь этим (sb):

$s = ping 129.69.1.153 | out-string
 if ( $s -match '(?s).+\D(\d+)ms' ) { $Matches }

Это (? S) делает это:

Ping wird ausgeführt für 129.69.1.153 mit 32 Bytes Daten:
 Antwort von 129.69.1.153: Bytes=32 Zeit=25ms TTL=51
 Antwort von 129.69.1.153: Bytes=32 Zeit=27ms TTL=51
 Antwort von 129.69.1.153: Bytes=32 Zeit=25ms TTL=51
 Antwort von 129.69.1.153: Bytes=32 Zeit=27ms TTL=51

 Ping-Statistik für 129.69.1.153:
 Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
 (0% Verlust),
 Ca. Zeitangaben in Millisek.:
 Minimum = 25ms, Maximum = 27ms, Mittelwert = 26ms

 match: ..

 Name Value 
 ---- ----- 
 1 26 
 0 ...

Я не знаю почему, но это работает.

3 ответа

Похоже, что в конце строки есть скрытое пространство, поэтому у регулярного выражения возникают проблемы. Это работает, просто протестировано.

($s.trim() | select-string "\d+(?=ms$)").Matches.Value

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

($s | select-string "\d+(?=ms\s*$)").Matches.Value


Если мое предположение заключается в том, что вы ищете Mittelwert = 27ms или номер 27 поскольку вы ссылаетесь на последний номер в ping.

Если это так, вы можете просто искать это слово как часть матча.

$s -match "Mittelwert\s+=\s+(\d+)ms"

ИЛИ

Вы можете использовать именованные группы в своем матче

$s -match "Mittelwert\s+=\s+(?<anzahl>\d+)ms"
</anzahl>

Чтобы вы могли использовать следующее вместо $matches

$matches.Anzahl


Вы можете попробовать экспериментировать с Test-Connection, если у вас новая версия Powershell

Если нет, я бы предложил следующее (поскольку Regex вряд ли когда-либо будет хорошей идеей)

$Tempfile = [System.IO.Path]::GetTempFileName()
$s = ping 129.69.1.153 | out-file $Tempfile
cat $Tempfile | Select-string "Antwort" | Select -last 1
Remove-item $Tempfile -force

licensed under cc by-sa 3.0 with attribution.