使用带日期比较的PowerShell解析XML

使用带日期比较的PowerShell解析XML,xml,powershell,xml-parsing,powershell-3.0,Xml,Powershell,Xml Parsing,Powershell 3.0,你能帮我调试代码吗 我正在使用Powershell脚本解析一个文件夹中的大量XML文件,并创建一个监控报告,以查看谁在修改XML以及何时修改。 所以,当我尝试比较修改的XML文件的日期和今天的日期($filterDate)时,问题就出现了 最初,我有一个装满XML文件的文件夹,我需要从这些文件中获取修改日期、用户和文件名。我添加了XML代码的示例 现在,带有的部分,其中对象{$\.TimeModified.Date-GE$filterDate}不适用于-GE,但是如果我尝试将其放入-LE,它会显

你能帮我调试代码吗

我正在使用Powershell脚本解析一个文件夹中的大量XML文件,并创建一个监控报告,以查看谁在修改XML以及何时修改。 所以,当我尝试比较修改的XML文件的日期和今天的日期(
$filterDate
)时,问题就出现了

最初,我有一个装满XML文件的文件夹,我需要从这些文件中获取修改日期、用户和文件名。我添加了XML代码的示例

现在,带有
的部分,其中对象{$\.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>

谢谢

正如我对您的问题的最佳解释,您希望在目标文件夹中的所有XML文件中选择
@date
@user
属性,其中
@date
大于给定的参考日期,例如“两天前”

可以使用
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}}
}

过去的时间比未来的时间短。由于
$filterdate
是代码运行的时间,因此过去的任何日期都将小于该时间。当我像$filterdate=(Get date).AddDays(-2).date那样使用$filterdate时,我得到了相同的错误。首先,我需要将其转换为TimeModified格式?在进行不同类型的比较时,LHS(左侧)指示要比较的对象类型。由于您没有对任何一方进行强制转换,
$\uuuu0.TimeModified.Date
被视为一个字符串,并使
$filterdate
也成为一个字符串。您需要像
[datetime]$\u0.TimeModified.Date
一样对其进行强制转换。
.TimeModified.Date
应该是什么?据我所知,您正在处理的对象中甚至没有一个具有此属性。我希望.TimeModified.Date这是上次修改此文件的时间,您可以在Windows的文件属性中看到。在internet btwSo中发现了它。问题是,我最初决定不与xml中的值进行比较,而是从Windows中获取“修改的日期”,实际上不是,因为Windows中修改的日期称为
。LastWriteTime
,而不是
。TimeModified
。您很可能会与
null
进行比较,因为您访问了一个不存在的属性。
$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}}
}