¿Podría ayudarme a depurar mi código?

Estoy usando un script de Powershell para analizar una gran cantidad de archivos XML de una carpeta y crear un informe de monitoreo, para revisar quién está modificando el XML y cuándo. Entonces, el problema está en el momento, cuando trato de comparar la fecha del archivo XML modificado y la fecha de hoy ($filterDate).

Inicialmente tengo una carpeta llena de archivos XML y necesito obtener desde el interior de estos archivos la fecha de modificación, el usuario y el nombre del archivo. Agregué un ejemplo de código XML.

En este momento, la parte con Where-Object {$_.TimeModified.Date -GE $filterDate} no funcionó con -GE, pero si trato de ponerlo -LE, me muestra la salida de todos los archivos.

XML de ejemplo

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

Estoy intentando tomar la parte <SrvModified> del 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 
    }
}

¡Gracias!

0
Derthag 25 oct. 2019 a las 13:52

1 respuesta

La mejor respuesta

De la mejor manera que he interpretado su pregunta, desea seleccionar los atributos @date y @user de todos <SrvModified> donde @date es mayor que una fecha de referencia determinada, por ejemplo " hace dos días ", en todos los archivos XML de la carpeta de destino.

Uno podría hacerlo usando 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}}
}
0
Tomalak 25 oct. 2019 a las 12:09