Listar subpastas em um determinado nível, com datas modificadas

6

Desafio para vocês, aqui:

Eu preciso de algum método (preferencialmente embutido, mas aplicativos de terceiros F / OSS também podem ser considerados) para gerar uma lista de sub-pastas, em um certo nível , junto com ( ou, melhor, filtrado por ) sua "data modificada". Por favor, note que eu preciso de uma lista de pastas apenas - a saída deve excluir arquivos.

Exemplo:

Para estrutura de pastas:

C:
\---Reports
    +----Task1
    |    \----Report1
    |         +----CSV
    |         +----HTML
    |         \----XML
    +----Task2
    |    +----Report1
    |    |    +----CSV
    |    |    +----HTML
    |    |    \----XML
    |    +----Report2
    |    |    +----CSV
    |    |    +----HTML
    |    |    \----XML
    |    \----Report3
    |         +----CSV
    |         +----HTML
    |         \----XML
    \----Task3
         +----Report1
         |    +----CSV
         |    +----HTML
         |    \----XML
         \----Report2
              +----CSV
              +----HTML
              \----XML

Eu quero que a lista tenha informações semelhantes a:

PATH                         | MODIFIED
=============================|==========
C:\Reports\Task1\Report1     | 6/23/2011
C:\Reports\Task2\Report1     | 6/17/2011
C:\Reports\Task2\Report2     | 6/30/2011
C:\Reports\Task2\Report3     | 7/06/2011
C:\Reports\Task3\Report1     | 6/22/2011
C:\Reports\Task3\Report2     | 7/13/2011

(Observe a exclusão de pastas acima ou abaixo do nível das pastas "Report #".)

Ou, idealmente, gostaria de algo que pudesse gerar um relatório como este:

PATH                         | MODIFIED
=============================|==========
C:\Reports\Task1\Report1     | 6/23/2011
C:\Reports\Task2\Report1     | 6/17/2011
C:\Reports\Task2\Report2     | 6/30/2011
C:\Reports\Task3\Report1     | 6/22/2011
=============================|==========
TOTAL                        |         4

(Observe que isso representa uma versão filtrada da lista anterior, restrita a um determinado período.)

Isso será feito no Windows XP / 2003. O PowerShell está disponível. Novamente, prefiro usar os utilitários internos disponíveis, mas as ferramentas de F / OSS também podem ser consideradas.

    
por Iszi 11.07.2011 / 20:26

1 resposta

9

Powershell:

gci C:\Reports\*\* | where {$_.LastWriteTime -gt ((get-date)- (new-timespan -day 7))} | select FullName,LastWriteTime | ft

Quebrando um pouco:

gci (também conhecido como get-childitem ) faz o que parece, trata o caminho do sistema de arquivos fornecido como um objeto e extrai os itens filhos (arquivos ou pastas) dele.

Isso é canalizado para a instrução where , que tem uma única função de filtro como argumento.

A função de filtro é uma comparação 'simples', neste caso {A -gt B}="Verdadeiro se A for Maior que B". A primeira parte disso é $_.LastWriteTime , que recebe cada objeto passado do pipe e retira a propriedade LastWriteTime. A última parte disso é uma construção de data relativa; nada é super simples no PS. A primeira parte da data date recebe a data atual, então ela subtrai uma quantidade de tempo daquele número (neste exemplo estou criando um novo objeto de data que contém o valor de 7 dias; então agora menos 7 dias daria a data 7 dias atrás).

A partir desses objetos que passaram pela filtragem where , estou retirando apenas as propriedades FullName e LastWriteTime, já que é tudo o que nos interessa.

Finall é canalizado para o comando format-table (aka ft ), por isso cria uma tabela bonita como esta:

FullName                           LastWriteTime
--------                           -------------
C:\Reports\Task1\Report1           7/11/2011 10:00:00 AM
C:\Reports\Task2\Report1           7/10/2011 5:00:00 AM
C:\Reports\Task2\Report2           7/6/2011 9:00:00 PM
C:\Reports\Task4\Report7           7/4/2011 3:00:00 PM

Para obter apenas a contagem de tudo isso, coloque o comando acima assim: (mess_from_above_less_the_ft_part).count (Tem que tirar a parte "| ft" ou adicionar 4 linhas de formatação de tabela que são contadas e descartarão sua contagem por 4.

    
por 11.07.2011 / 21:07