Localizando a data de modificação mais recente de todos os arquivos / subpastas em todos os diretórios de nível superior de um compartilhamento com o PowerShell

4

Eu tenho uma árvore de diretórios compartilhados em um servidor de arquivos do Windows 2003 que tem cerca de 100 GB de dados. Eu preciso encontrar todos os diretórios de nível superior neste compartilhamento onde a hora da última modificação para cada arquivo em cada subpasta não foi modificada sine 1/1/11. Essencialmente, estou procurando por ações abandonadas.

A estrutura de diretórios é algo parecido com isto:

-a
--a1
--a2
--a3
----a3_1

-b
--b1
--b2

-c
--c1
----c1_1

etc

O que eu quero fazer é descobrir se tudo não é um arquivo oculto sob a ou b ou c tem uma data de modificação antes ou depois de 1/1/11.

Até agora, posso encontrar os tempos de modificação após um ano para cada arquivo com isso:

get-childitem "\server\h$\shared" -recurse | where-object {$_.mode -notmatch "d"} |
where-object {$_.lastwritetime -lt [datetime]::parse("01/01/2011")}

O que eu não sei fazer é verificar cada diretório de nível superior individualmente para ver se todos os arquivos contidos nele são mais antigos que um ano. Alguma idéia?

    
por MDMarra 09.01.2012 / 15:48

1 resposta

4

Acho que você está pedindo para ver apenas os horários de modificação do arquivo . Não tenho certeza do que você deseja fazer com as pastas, que contêm apenas subpastas que não foram modificadas em um ano. Eu também não tenho certeza se por "cada diretório de nível superior" , você quer dizer a , b , c ou a , a1 , a2 ...

A seguir, os diretórios todos são exibidos, e listá-los somente se eles não contiverem arquivos gravados no ano anterior. Deixe-me saber se isso produz a saída que você está procurando:

$shareName = "\server\share"
$directories = Get-ChildItem -Recurse -Path $path | Where-Object { $_.psIsContainer -eq $true }

ForEach ( $d in $directories ) { 
    # Any children written in the past year?
    $recentWrites = Get-ChildItem $d.FullName | Where-Object { $_.LastWriteTime -gt $(Get-Date).AddYears(-1) } 
    If ( -not $recentWrites ) {
        $d.FullName
    }
}

Editar, por seu comentário. Se você deseja obter apenas os diretórios de nível superior que não contêm arquivos modificados no ano anterior, tente o seguinte. Note que em compartilhamentos muito profundos / grandes, isso pode levar algum tempo para ser executado.

$shareName = "\server\share"
# Don't -recurse, just grab top-level directories
$directories = Get-ChildItem -Path $shareName | Where-Object { $_.psIsContainer -eq $true }
ForEach ( $d in $directories ) { 
    # Get any non-container children written in the past year
    $recentWrites = Get-ChildItem $d.FullName -recurse | Where-Object { $_.psIsContainer -eq $false -and $_.LastWriteTime -gt $(Get-Date).AddYears(-1) } 
    If ( -not $recentWrites ) {
        $d.FullName
    }
}
    
por 09.01.2012 / 16:55

Tags