Altere a "data de modificação" de uma pasta (possivelmente no PowerShell)

Altere a "data de modificação" de uma pasta (possivelmente no PowerShell)

De vez em quando, quando forço o desligamento de uma máquina com Windows Server 2003 (não tenho escolha), todas as pastas contidas em um determinado diretório alteram sua 'data de modificação' para a data atual.

Felizmente, dentro de cada uma dessas pastas, os arquivos estão todos com a ‘data de modificação’ correta.

Um desses arquivos com o qual desejo copiar a "data de modificação (ou criação)" é um arquivo .jdf que cada uma das pastas contém.

Preciso de ajuda para criar um script no PowerSell.

Encontrei este script PS1 que quase faz o trabalho:

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..."
}
}

O problema é que o último objeto modificado dentro das pastas às vezes são subpastas que também obtêm a data atual como 'data de modificação'. Como posso fazer com que pareçam os arquivos dentro da pasta e não as pastas?

Responder1

Experimente isto:

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..."
    }
}

Responder2

Considerando que Get-ChildItem $root -directorydá o mesmo resultado que

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

você poderia tentar (não sei PSa sintaxe detalhada)

Get-ChildItem $root -file

ou mesmo

gci $root -file

Não tenho certeza se o restante do seu script precisa de melhorias ...

informação relacionada