XML-узлы удаления Powershell, где ChildNode "Date" старше месяца - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу найти все узлы «сообщения», в которых Дата старше определенной даты, и удалить их.

Если я использую $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 один раз в день.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Ваш xml недействителен: > in 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($_)
}
0 голосов
/ 13 сентября 2018

Это вернет узел message:

$result = $xml.transcript.messages.message | Where-Object {$_.date -like "2018-09-10*"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...