如何从Select-String获取值

时间:2014-11-21 11:37:15

标签: regex powershell match

我在一个文件夹中有几个文件,它们是.xml文件。

我想从这些文件中获取值。 文件中的一行可能如下所示:

<drives name="Virtual HD ATA Device" deviceid="\\.\PHYSICALDRIVE0" interface="IDE" totaldisksize="49,99">

我想要做的是在这种情况下得到49,99的值。

我可以通过以下方式从文件中获取该行:

$Strings = Select-String -Path "XML\*.xml" -Pattern totaldisksize

foreach ($String in $Strings) {
        Write-Host "Line is" $String

}

但只是获得“”的价值我不明白。我也玩过

$Strings.totaldisksize

但没有骰子。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以按如下方式在一行中执行此操作:

$(select-string totaldisksize .\XML\*.xml).line -replace '.*totaldisksize="(\d+,\d+)".*','$1'

Select-String将为您提供包含有关匹配信息的对象集合。 line属性是您感兴趣的属性,因此您可以直接提取该属性。

使用-replace运算符,每次.line属性与totaldisksize匹配时,您都可以在其上运行正则表达式。 $1替换将抓取正则表达式中的组,该组是括号(\d+,\d+)中的一部分,它将匹配一个或多个数字,后跟逗号,后跟一个或多个数字。

这将打印到屏幕,因为默认情况下,powershell会将对象打印到屏幕上。由于您只访问了.line媒体资源,因此这是唯一可以打印的内容,并且只有之后才能运行。

如果您想明确使用Write-Host查看结果,或对其执行任何其他操作,则可以按如下方式存储到变量:

$sizes = $(select-string totaldisksize .\XML\*.xml).line -replace '.*totaldisksize="(\d+,\d+)".*','$1'
$sizes | % { Write-Host $_ }

上面将结果存储到数组$sizes,然后通过将其传递给Foreach-Object%来迭代它。然后,您可以在块中使用$_访问数组元素。

答案 1 :(得分:0)

我不确定powershell但是如果您更喜欢使用python,则可以采用以下方法。

import re

data = open('file').read()
item = re.findall('.*totaldisksize="([\d,]+)">', data)
print(item[0])

输出

49,99

答案 2 :(得分:0)

但是......但是.. PowerShell知道XML。

$XMLfile = '<drives name="Virtual HD ATA Device" deviceid="\\.\PHYSICALDRIVE0" interface="IDE" totaldisksize="49,99"></drives>'
$XMLobject = [xml]$XMLfile
$XMLobject.drives.totaldisksize

输出

49,99

或者走树并返回“驱动器”的内容:

$XMLfile = @"
<some>
  <nested>
     <tags>       
        <drives someOther="stuff" totaldisksize="49,99" freespace="22,33">
        </drives>
     </tags>
  </nested>
</some>
"@

$drives = [xml]$XMLfile | Select-Xml -XPath "//drives" | select -ExpandProperty node

输出

PS> $drives

someOther         totaldisksize           freespace
---------         -------------           ---------
stuff                     49,99               22,33

PS> $drives.freespace
22,33

“// drives”的XPath查询=在XML树中的任何位置查找名为“drives”的所有节点。 参考:Windows PowerShell Cookbook第3版(Lee Holmes)。第930页。