2014-11-21 75 views
0

我在一個文件夾中有幾個文件,那些文件是.xml文件。如何從Select-String中獲取值

我想從這些文件中獲取一個值。 文件中的一條線,看起來是這樣的:

<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 

但是沒有骰子。

在此先感謝。

回答

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%。然後您可以在塊內使用$_訪問數組元素。

+0

謝謝。有用。任何機會,我可以打擾你解釋它?我不明白它是如何寫入主機的。 – user3019059 2014-11-21 12:11:13

+0

當然,更新了答案。希望更清楚? – arco444 2014-11-21 12:21:58

+0

令人驚歎。謝謝。 – user3019059 2014-11-21 12:28:15

0

我不確定關於powershell,但如果您更喜歡使用python,則可以這樣做。

import re 

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

輸出

49,99 
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 

XPath查詢「=在我的任何位置查找名爲」驅動器「的所有節點在XML樹中。 參考資料:Windows PowerShell Cookbook第3版(Lee Holmes)。頁930.

+0

好吧..如果線不看起來像這樣? – user3019059 2014-11-21 14:06:32

+0

這些文件之間有什麼共同點?我可以將「totaldisksize」作爲常見的ChildNode屬性嗎?我可以拿嗎? – evilSnobu 2014-11-21 14:36:14

+0

一行總是包含有時我需要totaldisksize,有時候需要freespace。 – user3019059 2014-11-21 15:13:00