2014-09-02 48 views
0

我只是想獲得的所有東西的ping返回的最後一個號碼:(M)。multiline正則表達式捕獲在PowerShell中失敗的最後一個數字?

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

谷歌說是多和+應該是貪婪越好。
但我得到的只是第二行的最後一個數字,而不是最後一行?

 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","") 

後平,並在比賽前非常符合第二條線的MS?

任何想法如何以簡單的方式解決這個簡單的請求?

謝謝你的答案,但鬼混我已經喜歡它(SB):

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

該做它(一個或多個):

 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     ... 

我不知道爲什麼 - 但它的工作原理。

+0

什麼是PowerShell中的以下你有什麼版本?測試連接是在cmdlet中構建的,用於執行與ping類似的操作(ICMP數據包) – Koliat 2014-09-02 12:22:50

+0

您可以顯示您嘗試捕獲的內容嗎?請求不清楚...你想要最後一個響應時間?那麼從你的樣本數據來看,它會是25ms? – 2014-09-02 13:10:46

+0

@Noah Sparks:我想要27ms的平均值:Mittelwert = 27ms。這是最後一個號碼。 – gooly 2014-09-02 13:29:32

回答

0

您可以嘗試使用測試,連接嘗試,如果你有一個新的Powershell的版本

如果沒有,我建議以下(因爲正則表達式是幾乎沒有一個好主意)

$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 
+0

我找到了工作匹配!不要使用(?m)多行但是(?s)單行:if($ s -match'(?s)。+ \ D(\ d +)ms'){$ Matches} - funny – gooly 2014-09-02 13:33:27

+0

How究竟是正則表達式幾乎不是一個好主意?相反,你應該有過多無用的代碼來完成更簡單的事情? – 2014-09-02 13:36:55

+0

只是個人認爲正則表達式很好,完全不直觀(至少它不會吸引我的直覺)。 Regex如何比我發佈的實際代碼更簡單? 'Select-String'基於正則表達式進行搜索,但它返回行(如'grep')。這樣OP可以搜索一個關鍵字並選擇正確的語句(在ping的情況下,它將始終是一個常數值) – Koliat 2014-09-02 13:39:07

1

它看起來像字符串末尾有一個隱藏的空間,這正是正則表達式遇到麻煩的原因。這工作,只是測試它。

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

或者你可以這樣做,但我認爲微調的空間。如果我assumtion是你正在尋找Mittelwert = 27ms或數27因爲你是指的倒數第一將是可取的

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

號碼在平。

如果是這種情況,您可以將該詞作爲匹配的一部分來查找。

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

OR

你可以使用命名組在比賽

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

這樣就可以運行代替$matches

$matches.Anzahl 
相關問題