我在一个文件夹中有几个文件,它们是.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
但没有骰子。
提前致谢。
答案 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页。