O script do PowerShell pode mover arquivos com menos de cinco minutos?

1

Temos uma pasta de rede usada como área de espera para arquivos XML que não foram processados corretamente. Fui solicitado a criar um script que fosse executado a cada cinco minutos e verificasse a pasta em busca de arquivos com menos de cinco minutos. Se encontrar arquivos com menos de cinco minutos, os moverá para outro diretório a ser processado.

O truque é que só queremos mover os arquivos uma vez. Se eles falharem uma segunda vez, eles serão jogados de volta nessa pasta e precisarão permanecer lá para serem tratados posteriormente.

Cada nome de arquivo contém um carimbo de data e hora exclusivo como parte do nome do arquivo. É um pouco complicado, mas o formato é:

YYYYMMDDHHmmSSSSS

Eu estava pensando que poderia haver uma maneira de o PowerShell observar o carimbo "mm" do nome do arquivo e compará-lo com a hora atual. Se tiver menos de cinco minutos, ele será movido. Se tiver mais de cinco minutos, deixa isso de lado.

Isso é possível?

    
por Grimm 26.10.2012 / 21:34

1 resposta

2

Tente o seguinte:

Get-ChildItem |
Where-Object {
  [datetime]::ParseExact($_.BaseName, "yyyyMMddHHmmss", $null) -gt (Get-Date).AddMinutes(-5)
} |
Move-Item -Destination C:\Path\to\target_dir

Eu divido o código em várias linhas para facilitar a leitura, mas é claro que você pode transformá-lo em uma linha única e até encurtar um pouco usando Aliases do PowerShell .

Explicação

  • Get-ChildItem retorna uma lista de todos os arquivos no diretório atual. Nota: ele também retorna subdiretórios, mas este código supõe que você tenha apenas arquivos lá. Os resultados são canalizados ( | ) para o próximo comando.

  • Where-Object percorre os resultados do comando anterior e retorna apenas aqueles que correspondem ao critérios especificados. $_ representa o arquivo atual de cada iteração e a propriedade .BaseName retorna o nome do arquivo sans extension.

  • A função [datetime]::ParseExact() usa uma string e um formato de data e converte em um objeto datetime.

  • Get-Date retorna a data e a hora atuais. A função AddMinutes() deduz 5 minutos da hora atual.

  • Os arquivos retornados por Where-Object , então, são aqueles em que a data e a hora representadas no nome do arquivo não são mais do que 5 minutos mais antigos que a hora atual.

  • Por fim, Move-Item move os arquivos correspondentes para o diretório especificado.

por 26.10.2012 / 22:01