使用带日期比较的PowerShell解析XML
你能帮我调试代码吗 我正在使用Powershell脚本解析一个文件夹中的大量XML文件,并创建一个监控报告,以查看谁在修改XML以及何时修改。 所以,当我尝试比较修改的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,它会显
$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}}
}