Cambiar la "fecha de modificación" de una carpeta (posiblemente en PowerShell)

Cambiar la "fecha de modificación" de una carpeta (posiblemente en PowerShell)

De vez en cuando, cuando fuerzo el apagado de una máquina con Windows Server 2003 (no tengo otra opción), todas las carpetas contenidas en un determinado directorio cambian su 'fecha de modificación' a la fecha actual.

Afortunadamente, dentro de cada una de estas carpetas, todos los archivos tienen la "fecha de modificación" correcta.

Uno de estos archivos con el que quiero copiar la "fecha de modificación (o creación)" es un archivo .jdf que tiene dentro cada una de las carpetas.

Necesito ayuda para crear un script en PowerSell.

Encontré este script de PS1 que casi hace el trabajo:

Get-ChildItem $root | Where-Object {$_.PSIsContainer} | Foreach-Object{

# get the oldest file for the current directory object
$oldest = Get-ChildItem $_.FullName | Sort-Object LastWriteTime | Select-Object LastWriteTime -Last 1

if($oldest)
{
# oldest object found, set current directory LastWriteTime
$_ | Set-ItemProperty -Name CreationTime -Value $oldest.LastWriteTime 
$_ | Set-ItemProperty -Name LastWriteTime -Value $oldest.LastWriteTime
}
else
{
# current directory is empty, directory LastWriteTime is left unchanged
Write-Warning "Directory '$($_.FullName)' is empty, skiping..."
}
}

El problema es que el último objeto modificado dentro de las carpetas a veces son subcarpetas que también obtienen la fecha actual como "fecha de modificación". ¿Cómo puedo hacer que se vean los archivos dentro de la carpeta y no las carpetas?

Respuesta1

Prueba esto:

Get-ChildItem $root |
    Where-Object { $_.PSIsContainer } |
Foreach-Object{
    
    $oldest = Get-ChildItem $_.FullName |
        Where-Object { ! $_.PSIsContainer } |
            Sort-Object LastWriteTime |
    Select-Object -Last 1

    if($oldest)
    {
        $_ | Set-ItemProperty -Name CreationTime -Value $oldest.LastWriteTime 
        $_ | Set-ItemProperty -Name LastWriteTime -Value $oldest.LastWriteTime
    }
    else
    {
        # current directory is empty, directory LastWriteTime is left unchanged
        Write-Warning "Directory '$($_.FullName)' is empty, skiping..."
    }
}

Respuesta2

Mientras que Get-ChildItem $root -directoryda el mismo resultado que

Get-ChildItem $root | Where-Object {$_.PSIsContainer}

podrías intentarlo (no conozco PSla sintaxis detallada)

Get-ChildItem $root -file

o incluso

gci $root -file

No estoy seguro de si el resto del guión necesita mejoras...

información relacionada