2017-07-28 96 views
1

我正在嘗試搜索特定字符串的目錄中的最新日誌文件。該字符串讀取Number of days since last service=並在等號後是一個數字。我想提取該數字以便稍後在我的PowerShell程序中使用。這是我到目前爲止從文件powershell中的字符串中提取值

$logDir= "C:logs\" 
$latest = Get-ChildItem -Path $logdir | Sort-Object LastAccessTime -Descending | Select-Object -First 1 
$findStr = Select-String -Path $latest.name -Pattern "Number of days since last service=" 

但現在我卡住了。這就是它實際上看起來像日誌

<Msg>Number of days since last service =18</Msg> 

所以我不知道如何做的是提取等號之間的數字簽名和<爲這個特殊的字符串

+0

他們使用XML結構化的日誌格式非常好,所以您不必使用正則表達式和文本切片來獲取數據。 ':facepalm:' – TessellatingHeckler

回答

1

您可以使用選擇串用正則表達式捕獲組。

$Matches = Select-String -Path $latest.name -Pattern "last service =(\d+)" | % {$_.Matches.Groups[1].Value} 
0

在你既然知道了之前和之後,你想要的數據串,你可以只在-Replace操作刪除不需要的文本:

$Days = $findStr -replace '<Msg>Number\ of\ days\ since\ last\ service\ =','' -replace '</Msg>','' 

另外,由於信息是字符串中唯一的號碼,你可以使用-Match\d+(一個或多個數字)來獲得該值。

$findStr -match '\d+' 
$Days = $Matches.Values 
+1

爲了您的第一個答案,您可以更簡單地執行'$ Days = $ findstr -replace'\ 自上次服務以來的天數= \ * *(\ d +)。*','$ 1'' – TheMadTechnician

0

我能夠做這樣

$result =[regex]::Match($findStr, '=([^/)]+)<').Groups[1].Value 
+2

'Select-String'輸出正則表達式的MatchInfo對象,所以'$ findStr'已經是你可以使用Groups和Value的東西了,如果你把分組放在你的select-string正則表達式中的話。 (而不是將它強制回到字符串中,並將它們再次匹配爲正則表達式) – TessellatingHeckler

0

您現在可能已經得到了您的答案,但是「Imma giv eya more!」 假設我們有這些規定的時間提前:用的正則表達式做事

$Log = "<Stuff><Msg>Number of days since last service =18</Msg></Stuff>" 
$StringHint = "Number of days since last service =" 

1.您的典型選擇字符串的方法。是的。

Select-String -InputObject $Log -Pattern "(?<=$StringHint)\d{1,}(?=<)" -AllMatches | % {$_.Matches.Groups[0].Value} 

2.做劈叉:

((($Log -split $StringHint)[1]) -split "<")[0] 

3. XML的方式。這僅適用於XML日誌文件,並且如果沒有其他MSG標記(在這種情況下不太可能)。 我之所以選擇包括這個,是因爲我認爲簡單的類型轉換可以極大地改變我們如何處理數據是很酷的。此外,這是一種非常簡單的方法,可以清除討厭的<的和離開。

$xml = [xml]$Log 
$EqualsLoc = $xml.Stuff.Msg.IndexOf("=") 
$xml.Stuff.Msg.Substring($EqualsLoc+1) 

以上將是更好的,如果你有這樣的日誌文件(是的,我知道這是一個配置文件,而不是一個日誌文件):

$XML = [xml]"<Application> 
    <version>1.3.53</version> 
    <AdvancedSettings> 
     <Network> 
      <InternetForWeebs>False</InternetForWeebs> 
      <HackAllTheSystems>True</HackAllTheSystems> 
      <L33tHandle>Gingervitis</L33tHandle> 
     </Network> 
    </AdvancedSettings> 
    <BasicSettings> 
     <Controls> 
      <TheAnyKeyDesignation>0x42</TheAnyKeyDesignation> 
      <CanHazCheeseburgerMode>True</CanHazCheeseburgerMode> 
     </Controls> 
    </BasicSettings> 
    <Diagnostics> 
     <DaysSinceLastService>18</DaysSinceLastService> 
    </Diagnostics> 
</Application>" 

然後,獲得您需要的條目就像這樣簡單:

$XML.Application.Diagnostics.DaysSinceLastService 
+1

或者,如果您不知道路徑,並且只知道它是Msg節點,那麼可以使用'Select-Xml':'$ XML | Select-Xml -XPath'.Msg'|其中{$ _。Node.InnerXML -match(?<= $ StringHint)(\ d {1,})(?= <)「} | %{$ Matches [1]}' – TheMadTechnician

+0

'\ d {1,}'與'\ d +'相同,因爲它匹配一個或多個發生。 – ConnorLSW