我想找到日期早于特定日期的所有“消息”节点,并将其删除。
如果我使用的是$result = $xml.transcript.messages.message.date | Select-String -Pattern "2018-09-10"
,则可以找到所需的日期节点,但是我认为$ result只是一个字符串,并且无法访问父节点并将其删除。 / p>
<transcript>
<messages>
<message>
<to>user1</to>
<from>user2/Spark</from>
<body>Message Bla Bla Bla</body>
<date>2018-09-05 11:56:50.961 MESZ</date>
</message>
<message>
<to>user1</to>
<from>user2/Spark</from>
<body>>Message Bla Bla Bla</body>
<date>2018-09-10 15:26:50.299 MESZ</date>
</message>
<message>
<to>user2</to>
<from>user1/Spark</from>
<body>>Message Bla Bla Bla</body>
<date>2018-09-12 09:38:01.997 MESZ</date>
</message>
<message>
<to>user1/Spark</to>
<from>user2/Spark</from>
<body>>Message Bla Bla Bla</body>
<date>2018-09-12 09:38:19.382 MESZ</date>
</message>
</messages>
</transcript>
对于那些了解Spark IM的人,我基本上只是想每天通过Powershell删除一次较旧的消息。
在此先感谢您的帮助!
答案 0 :(得分:0)
这将返回message
节点:
$result = $xml.transcript.messages.message | Where-Object {$_.date -like "2018-09-10*"}
答案 1 :(得分:0)
您的xml无效:>
中的body
应该转义。幸运的是,PowerShell不太严格。这应该起作用:
$xml = [xml]@'
<transcript>
<messages>
<message>
<to>user1</to>
<from>user2/Spark</from>
<body>Message Bla Bla Bla</body>
<date>2018-08-05 11:56:50.961 MESZ</date>
</message>
<message>
<to>user1</to>
<from>user2/Spark</from>
<body>>Message Bla Bla Bla</body>
<date>2018-09-10 15:26:50.299 MESZ</date>
</message>
<message>
<to>user2</to>
<from>user1/Spark</from>
<body>>Message Bla Bla Bla</body>
<date>2018-09-12 09:38:01.997 MESZ</date>
</message>
<message>
<to>user1/Spark</to>
<from>user2/Spark</from>
<body>>Message Bla Bla Bla</body>
<date>2018-09-12 09:38:19.382 MESZ</date>
</message>
</messages>
</transcript>
'@
$xml.PreserveWhitespace = $true
$xml.SelectNodes('//message') | where { ([DateTime]$_.date.Substring(0, 23)) -lt [DateTime]::Now.AddMonths(-1) } | % {
$xml.transcript.messages.RemoveChild($_)
}