我想找到日期早于特定日期的所有“消息”节点并删除它们。
如果我正在使用$result = $xml.transcript.messages.message.date | Select-String -Pattern "2018-09-10"
我可以找到我正在寻找的日期节点,但我认为$ result只是一个字符串,我无法访问父节点并删除它。
<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删除一次旧邮件。
在此先感谢您的帮助!
这将返回message
节点:
$result = $xml.transcript.messages.message | Where-Object {$_.date -like "2018-09-10*"}
你的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($_)
}