Script para renomear arquivos e adicionar um registro de data e hora (servidor 2012 r2)

1

Estou com dificuldades para criar um script de arquivo em lote (bastante simples) que atenda a esses requisitos:

  • Parece na pasta chamada Origem de um arquivo (com qualquer nome.csv)
  • Renomeia o arquivo para File_YYYYMMDD_HHMinMinSS.csv (o carimbo de data / hora deve ser modificado / data de criação, se possível (modificado / criação deve ser a mesma coisa para que funcione)
  • Move-o para uma pasta chamada Destino, onde mais trabalho pode ser feito nele.

1 arquivo é criado por dia, então deve ser apenas 1 lá, mas se houver mais de 1 (porque o script não está rodando por alguma razão) ele deve ser capaz de fazer vários arquivos ou apenas pegar o primeiro e manuseá-lo corretamente. (Eu posso agendar para que ele seja executado várias vezes por dia para pegar qualquer um que não tenha sido processado antes.

Então aqui está meu código até agora. Eu juntei tudo do Google e funciona de uma forma, mas não faz exatamente o que eu quero.

echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%

set stamp=%YYYY%%MM%%DD%_%HH%%Min%%Sec%

move "c:\test\source\*.csv" "c:\test\destination\File_%stamp%.csv"

Ele encontra o arquivo ok. Ele o renomeia no formato desejado (mas usa a data e a hora atuais, não sei como usar a data modificada ou criada) e move-o corretamente. Mas só funciona para um único arquivo. Se houver vários arquivos no diretório, ele cometerá erros que não podem mesclar vários arquivos em um único arquivo (o que faz sentido, não é possível renomear todos os arquivos para um arquivo.

Mas estou preso. Eu não sei como ir mais longe. Alguém pode me ajudar? Eu entendo vagamente o que o código está fazendo, mas não o suficiente para manipulá-lo para fazer o que eu quero.

O Powershell também seria uma opção, mas eu sei ainda menos sobre como fazer isso lá. Se houver outra opção que possa ser facilmente agendada por meio do agendador de tarefas, isso também funcionaria.

    
por SysAdminUK 26.06.2017 / 16:54

1 resposta

2

Este pouco de powershell faz o que você quer. Basta colocar o caminho completo para os diretórios de origem e destino na parte superior entre aspas.

Editar: adicionou um pouco sobre a hora de criação do arquivo. Editar: exemplos de nomenclatura adicionados, o # é um comentário, deixe apenas um $name = descomentado por vez, se você descomentar vários, será o último descomentado que entra em vigor.

$source = "c:\te\s"
$destination = "c:\te\d"

Get-ChildItem $source -Recurse -Include *.csv | % {
    $name = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    #$name = "Finished_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    #$name = "Finished_" + $_.Name.Split(".")[0] +  "_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    Rename-Item $_ -NewName $name
    Move-Item "$($_.Directory)\$name" -Destination $destination
}

Como um aparte, eu sugiro que você reserve um pouco de tempo todos os dias para aprender PowerShell, é realmente uma ótima ferramenta, e muito mais amigável que scripts em lote, como linguagens de script, é fácil de ler, principalmente porque está escrito em inglês quase simples. Este é um bom recurso para recursos ! :)

    
por 26.06.2017 / 17:03