2017-05-29 140 views
1

我正在使用powershell做一些清理復古pi遊戲列表,但我堅持使用XML的語法。 目標是刪除特定文件擴展名類型的所有遊戲條目。Powershell:在XML節點中搜索文件擴展名並刪除父節點

清單的格式爲這樣:

<?xml version="1.0"?> 
<gameList> 
    <game id="" source=""> 
     <path>./2020 Super Baseball (USA).SMC</path> 
     <name>2020 Super Baseball</name> 
     <desc /> 
     <image>./boxart/2020 Super Baseball (USA).png</image> 
     <marquee>./wheel/2020 Super Baseball (USA).png</marquee> 
     <video>./snap/2020 Super Baseball (USA).mp4</video> 
     <releasedate /> 
     <developer /> 
     <publisher /> 
     <genre /> 
    </game> 
    <game id="" source=""> 
     <path>./2020 Super Baseball (USA).smc</path> 
     <name>2020 Super Baseball</name> 
     <desc /> 
     <image>./boxart/2020 Super Baseball (USA).png</image> 
     <marquee>./wheel/2020 Super Baseball (USA).png</marquee> 
     <video>./snap/2020 Super Baseball (USA).mp4</video> 
     <releasedate /> 
     <developer /> 
     <publisher /> 
     <genre /> 
    </game> 
</gameList> 

每場比賽既有.smc和.SMC項,我要刪除的.SMC

到目前爲止,我已經能夠循環訪問文件並刪除路徑中包含.SMC擴展名的每個遊戲節點的內容。

# Load the existing document 
[xml]$xml = Get-Content "snes-gamelist.xml" 

#Iterate through each game node 
ForEach($Path in $xml.gamelist.game.path | Where-Object {$_ -like "*.SMC"}) 
{ 

$xml.SelectsingleNode("//path[.='"+$Path+"']") | % { 
$_.ParentNode.RemoveAll() } 

} 

#Output 
$xml.save("MOD-snes-gamelist.xml") 

問題是,實際的遊戲節點仍然落後,我不知道如何完全刪除它。

<?xml version="1.0"?> 
<gameList> 
    <game> 
    </game> 
    <game id="" source=""> 
     <path>./2020 Super Baseball (USA).smc</path> 
     <name>2020 Super Baseball</name> 
     <desc /> 
     <image>./boxart/2020 Super Baseball (USA).png</image> 
     <marquee>./wheel/2020 Super Baseball (USA).png</marquee> 
     <video>./snap/2020 Super Baseball (USA).mp4</video> 
     <releasedate /> 
     <developer /> 
     <publisher /> 
     <genre /> 
    </game> 
</gameList> 

在此先感謝。

回答

2

RemoveAll()從選定節點中刪除所有內容。你想要做的是刪除整個節點。

如果使用 foreach($node in $xml.gameList.game | Where-Object {$_.path -clike "*.SMC")}得到節點,你可以用$xml.gameList.RemoveChild($node)刪除它。你

也應該使用-clike代替-like因爲-like比較區分大小寫,並且將匹配都.smc和.SMC。

+0

非常感謝J. Bergger。我實際上是在發佈自己的解決方案,但是你的解決方案比我的解決方案要好得多。 –