Powershell XML删除ChildNode“日期”早于一个月的节点

时间:2018-09-13 05:52:55

标签: xml powershell automation

我想找到日期早于特定日期的所有“消息”节点,并将其删除。

如果我使用的是$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删除一次较旧的消息。

在此先感谢您的帮助!

2 个答案:

答案 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($_)
}