【问题标题】:Parsing XML with PowerShell with date comparison使用 PowerShell 解析 XML 并进行日期比较
【发布时间】:2020-02-21 17:24:07
【问题描述】:

你能帮我调试一下我的代码吗?

我正在使用 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>

我正在尝试从 XML 中获取 &lt;SrvModified&gt; 部分。

$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 
    }
}

谢谢!

【问题讨论】:

  • 过去的时间小于未来的时间。由于$filterdate是代码运行的时间,那么过去的任何日期都会小于那个时间。
  • 当我使用 $filterDate 像 $filterDate = (Get-Date).AddDays(-2).Date 时,我得到了同样的错误。我需要先将其转换为 TimeModified 格式吗?
  • 在比较不同类型时,LHS(左侧)指示要比较的对象类型。由于您没有转换任何一方,$_.TimeModified.Date 被认为是一个字符串,并且使 $filterdate 也成为一个字符串。你需要像[datetime]$_.TimeModified.Date一样投射它。
  • .TimeModified.Date 到底应该是什么?据我所知,您正在处理的任何对象都没有这个属性。
  • 我希望 .TimeModified.Date 是上次修改这个文件的时间,你可以在 Windows 的文件属性中看到。顺便说一句,在互联网上找到它

标签: xml powershell xml-parsing powershell-3.0


【解决方案1】:

根据我对您的问题的解释,您希望选择所有&lt;SrvModified&gt;@date@user 属性,其中@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}}
}

【讨论】:

  • 所以问题是我最初决定不与 xml 中的值进行比较,而是从 windows 中获取“修改日期”
  • 并非如此,因为 Windows 中的修改日期称为 .LastWriteTime,而不是 .TimeModified。很有可能您与 null 进行了比较,因为您访问了一个不存在的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2013-11-27
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多