Синтаксический анализ XML с помощью PowerShell со сравнением дат - PullRequest
0 голосов
/ 25 октября 2019

Не могли бы вы помочь мне отладить мой код.

Я использую скрипт Powershell для анализа большого количества файлов XML из одной папки и создания отчета о мониторинге, чтобы выяснить, кто изменяет XML икогда. Итак, проблема в том, когда я пытаюсь сравнить дату изменения файла XML и сегодняшнюю дату ($filterDate).

Изначально у меня есть папка, полная файлов XML, и мне нужно получитьвнутри этих файлов дата изменения, пользователь и имя файла. Я добавил пример кода XML.

Прямо сейчас, часть с Where-Object {$_.TimeModified.Date -GE $filterDate} не работает с -GE, но если я попытаюсь поставить -LE, она покажет мне вывод из всех файлов.

Пример XML

<ModullarRule schema="3.2" id="2132135e" entrypoint="12321321321313ce2" design="118;51">
    <Name>AnyShit2Queue</Name>
    <Description/>
    <Comments/>
    <RuleAudit stamp="2132131237" version="0.SS@TEST.3">
        <SrvModified date="2018.11.29 09:35:11" user="User1"/>
        <XmlModified date="2017.12.05 17:13:49" user="User2"/>
        <SrvCreated date="2017.12.05 10:07:36" user="User2"/>
        <XmlCreated date="2017.12.05 10:07:36" user="User2"/>
    </RuleAudit>
</ModullarRule>

Я пытаюсь извлечь часть <SrvModified> из XML.

$Path = "C:\Test"
$filterDate = Get-Date -format "yyyy.MM.dd hh:mm:ss"

Get-ChildItem -Path $Path -Filter '*.xml' -File -Recurse | ForEach-Object {
    [xml]$xml = Get-Content -Path $_.FullName | Where-Object {
        $_.TimeModified.Date -LE $filterDate
    }
    foreach ($item in $xml.ModullarRule.RuleAudit.SrvModified) {
        $Xml.ModullarRule.RuleAudit.SrvModified | Select date, user 
    }
}

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2019

Насколько я правильно истолковал ваш вопрос, вы хотите выбрать @date и @user атрибуты для всех <SrvModified>, где @date больше заданной контрольной даты, например, "два дня назад",во всех файлах XML в целевой папке.

Это можно сделать, используя Where-Object:

$path = "C:\Test"
$refDate = (Get-Date).AddDays(-2).ToString('yyyy.MM.dd HH:mm:ss')

Get-ChildItem -Path $Path -Filter '*.xml' -File -Recurse | ForEach-Object {
    $xmlPath = $_.FullName

    $xml = New-Object xml
    $xml.Load($xmlPath)

    $xml.ModullarRule.RuleAudit.SrvModified |
        Where-Object date -gt $refDate |
        Select-Object date, user, @{name="file"; expr={$xmlPath}}
}
...