我正在尝试在目录中搜索特定字符串的最新日志文件。字符串读取Number of days since last service=
,等号后面是数字。我想提取该数字,以便稍后在我的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 :(得分:1)
您可以将Select-String与正则表达式捕获组一起使用。
$Matches = Select-String -Path $latest.name -Pattern "last service =(\d+)" | % {$_.Matches.Groups[1].Value}
答案 1 :(得分:0)
由于您知道所需数据之前和之后的字符串,因此您只需-Replace
运算符即可删除不需要的文字:
$Days = $findStr -replace '<Msg>Number\ of\ days\ since\ last\ service\ =','' -replace '</Msg>',''
或者,由于信息是字符串中唯一的数字,因此您可以使用-Match
和\d+
(一个或多个数字)来获取值。
$findStr -match '\d+'
$Days = $Matches.Values
答案 2 :(得分:0)
我能够像这样做
null
答案 3 :(得分: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。您使用Regexes的典型Select-String方法。是的。
Select-String -InputObject $Log -Pattern "(?<=$StringHint)\d{1,}(?=<)" -AllMatches | % {$_.Matches.Groups[0].Value}
2。做拆分:
((($Log -split $StringHint)[1]) -split "<")[0]
3。 XML方式。这仅适用于XML日志文件,如果没有其他MSG标记(在这种情况下不太可能)。 我之所以选择包含这个,是因为我认为简单的类型转换可以极大地改变我们处理数据的方式。另外,这是一种非常简单的方式来剥离讨厌的&lt;'s和&gt ;.
$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