从文件powershell中的字符串中提取值

时间:2017-07-28 18:13:51

标签: powershell

我正在尝试在目录中搜索特定字符串的最新日志文件。字符串读取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>

所以我不知道该怎么办是提取等号和<之间的数字为这个特定的字符串

4 个答案:

答案 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