none
Script para verificar data de modificação/criação arquivos RRS feed

  • Pergunta

  • Galera preciso de uma ajuda, já dei uma caçada na internet e ate mesmo aqui mais não encontrei o que estou precisando, eu tenho uma pasta com N arquivos, esses arquivos são atualizados todos os dias as X horas, no dia recorrente eu faço backup desses arquivos, porem tenho uma problema, esses arquivos são gerados em varias maquinas, as vezes ocorre de um arquivos nao ser atualizado localmente, e meu servidor busca esse arquivo, ou seja estou fazendo backup de um arquivo desatualizado, precisava de um script que verificasse a data de criação/modificação desses arquivos, estes ficam em uma basta Backup e dentro existem varias pastas e subpastas onde estão os arquivos, e gostaria que isso gerasse um log com o nome do arquivo e a data para eu verificar antes de prosseguir com o backup, ou se alguém souber de algum script que faça isso e envie por email, só lembrando que por exemplo hj faria backup e os arquivos teria que estar com data do dia 18, preciso que liste todos os arquivos ou liste os arquivos que estão com data diferente do dia anterior, fico no aguardo
    terça-feira, 19 de agosto de 2014 13:18

Respostas

  • Se todos os arquivos estão em uma pasta, você não vai setar manualmente os arquivos no script.
    Você apenas vai mandar ele adquirir todos os arquivos com o comando Get-ChildItem e coletará os dados de cada arquivo utilizando um laço de repetição.

    Examplo:

    # Adquire o caminho completo de cada arquivo na pasta C:\Backup
    $arquivos = (Get-ChildItem -Path "c:\Backup").FullName
    
    # Executa o comando em cada linha da variável $arquivos
    foreach ($file in $arquivos)
    {
       # Adquire a última data de modificação de cada arquivo na variável $lastWrite
       $lastWrite = (Get-Item $file).LastWriteTime
    }
    
    
    Dentro do foreach você executa o desvio condicional que eu passei anteriormente para substituir pela data mais atual.
    Tente montar esse script e poste ele aqui caso tenha dúvidas.


    Att, Paulo Rocha MCP | MCDST | MCSA Server 2012

    quinta-feira, 21 de agosto de 2014 10:28

Todas as Respostas

  • Você pode fazer em PowerShell.

    Você adapta pra sua necessidade, mas ficaria mais ou menos assim:

    $primeiroArquivo=Get-Item $caminhoDoArquivo1
    $segundoArquivo=Get-Item $caminhoDoArquivo2
    
    # Verifica se a última modificação do primeiro arquivo é maior ou igual ao do segundo
    if ($primeiroArquivo.LastWriteTime -ge $segundoArquivo.LastWriteTime) {
        Copy-Item -path $primeiroArquivo -Destination $destino -Force
    } else {
           Copy-Item -path $segundoArquivo-Destination $destino -Force
    }
    


    Att, Paulo Rocha MCP | MCDST | MCSA Server 2012

    quarta-feira, 20 de agosto de 2014 14:54
  • Então na verdade são mais de 90 arquivos com extensão .BAK, são arquivos de backup de banco de dados, entao nao daria certo pq pra setar 90 arquivos acho que nao compensa, o ralatorio com o txt somente com os arquivos e a data consegui fazer, agora gostaria de extrair desse arquivo txt somente as linhas que contem os arquivos com a data diferente do dia, tipo o backup localmente é gerado as 23:40, se por algum motivo ele nao atualizar o backup do arquivo no dia ele ficara com data do dia anterior, as 23:55 rodo um scrip que verifica a data desses arquivos e me gere um txt com o nome dos arquivos que nao atualizaram n o dia, ex: Gero um script e a saída é a seguinte:

    20/08/2014 arqui1.txt

    20/08/2014 arqui2.txt

    15/08/2014 arqui3.txt

    17/08/2014 arqui4.txt

    20/08/2014 arqui5.txt

    Ao gerar esse script preciso que a saída seja:

    15/08/2014 arqui3.txt

    17/08/2014 arqui4.txt

    quarta-feira, 20 de agosto de 2014 19:49
  • Se todos os arquivos estão em uma pasta, você não vai setar manualmente os arquivos no script.
    Você apenas vai mandar ele adquirir todos os arquivos com o comando Get-ChildItem e coletará os dados de cada arquivo utilizando um laço de repetição.

    Examplo:

    # Adquire o caminho completo de cada arquivo na pasta C:\Backup
    $arquivos = (Get-ChildItem -Path "c:\Backup").FullName
    
    # Executa o comando em cada linha da variável $arquivos
    foreach ($file in $arquivos)
    {
       # Adquire a última data de modificação de cada arquivo na variável $lastWrite
       $lastWrite = (Get-Item $file).LastWriteTime
    }
    
    
    Dentro do foreach você executa o desvio condicional que eu passei anteriormente para substituir pela data mais atual.
    Tente montar esse script e poste ele aqui caso tenha dúvidas.


    Att, Paulo Rocha MCP | MCDST | MCSA Server 2012

    quinta-feira, 21 de agosto de 2014 10:28
  • Resolvi da seguinte forma:

    @echo off
    dir D:\Backup\ /t:w /s /o:g >D:\Log\Log_Geral\log_arq.log
    find ".BAK" D:\Log\Log_Geral\log_arq.log >D:\Log\Log_Geral\log_arq_date.log
    del D:\Log\Log_Geral\log_arq.log /q

    FOR /F "TOKENS=1-4* DELIMS=/" %%A IN ('DATE/T') DO (
    SET Year=%%C
    SET Month=%%B
    SET Day=%%A
    )
    FOR %%A IN (%Day%) DO SET Day=%%A
    FOR %%A IN (%Month%) DO SET Month=%%A
    FOR %%A IN (%Year%) DO SET Year=%%A

    Ren "D:\Log\Log_Geral\"log_arq_date.log log_arq_%Day%-%Month%-%Year%.log

    Blz consegui a lista somente com os arquivos e as datas, agora existe algum meio de pegar esse arquivo e enviar por email automaticamente?

    sexta-feira, 29 de agosto de 2014 12:59
  • Alguem?
    terça-feira, 2 de setembro de 2014 16:52
  • Denis,

    Não sei por qual motivo você optou por fazer um batch ao invés de utilizar o script em PowerShell que enviei, quando este é extremamente mais simples.

    Se você fizer em PowerShell, já terá o cmdlet Send-MailMessage que faz o envio de e-mail.

    Existe um executável que você pode utilizar em um batch também, só não me recordo o nome, dê uma pesquisada que você irá encontrar.

    Mas eu optaria por fazer no PowerShell, pois já vem com todos esses recursos disponíveis.


    Att, Paulo Rocha MCP | MCDST | MCSA Server 2012

    terça-feira, 2 de setembro de 2014 20:22
  • Se todos os arquivos estão em uma pasta, você não vai setar manualmente os arquivos no script.
    Você apenas vai mandar ele adquirir todos os arquivos com o comando Get-ChildItem e coletará os dados de cada arquivo utilizando um laço de repetição.

    Examplo:

    # Adquire o caminho completo de cada arquivo na pasta C:\Backup
    $arquivos = (Get-ChildItem -Path "c:\Backup").FullName
    
    # Executa o comando em cada linha da variável $arquivos
    foreach ($file in $arquivos)
    {
       # Adquire a última data de modificação de cada arquivo na variável $lastWrite
       $lastWrite = (Get-Item $file).LastWriteTime
    }
    Dentro do foreach você executa o desvio condicional que eu passei anteriormente para substituir pela data mais atual.
    Tente montar esse script e poste ele aqui caso tenha dúvidas.


    Att, Paulo Rocha MCP | MCDST | MCSA Server 2012

    Oi, sei que o post é antigo, mas essa sua resposta foi a única perto do que eu preciso que encontrei na internet, estou com dificuldade em pegar a data do ultimo aqruivo gravado na pasta ao invés do mais antigo e então comparar a data e horário atual e se a diferença entre "firstwrite" e o horário atual for maior que 10 min o script manda um e-mail de alerta. poderia me ajudar? 
    quarta-feira, 3 de fevereiro de 2021 14:11
  • 10 Minutos? Você quer encher a sua caixa de correio ou algo assim?

    O que é "firstwrite" a data de criação ou modificação?

    Qual seria o objetivo de realizar essa tarefa?


    R. Bohner

    quarta-feira, 3 de fevereiro de 2021 20:11
  • Sim 10 minutos, são arquivos de extrema importância que não podem ficar na pasta por mais de 10 minutos sem que ninguém saiba, "Firstwrite" seria o arquivo mais novo da pasta, mas sobre isso consegui achar uma alternativa então minha dúvida é sobre a lógica de comparação das datas, como eu faria para pegar a data do mais antigo e se ele estivesse há 10 ou mais minutos dentro dessa pasta o email seria disparado? A parte do envio de e-mail já fiz também é só essa comparação da data que estou com dificuldade. Agradeço desde já.
    quinta-feira, 4 de fevereiro de 2021 10:56
  • Pode criar um arquivo batch ou powershell que faz isso.

    dir /od

    Salva a parte de data e hora em uma variável e compara com a Data e hora do sistema %Date% %Time%

    Ai cria um IF para verificar se o arquivo tem mais de 10 minuots.

    Ai se tiver mais de 10 minutos roda o script programa que envia e-mail.

    O que deve acontecer com o arquivo que tiver mais de 10 minutos depois que já foi enviado o e-mail ele será movido para outro local ou algo assim? Ou vai contiunar enviando e-mail até que alguèm faça algo com o arquivo.


    R. Bohner


    quinta-feira, 4 de fevereiro de 2021 11:52
  • Como uso comando dir / od no powershell? E é exatamente no if da comparação de tempo que estou com problema de criar a lógica das condições, poderia me ajudar com isso? Sobre os arquivos quando enviado um email deve haver uma ação manual sobre eles de quem for notificado, após isso existe uma aplicação que move os arquivos então sobre oque acontece depois dessa verificação e a notificação não é um problema.
    quinta-feira, 4 de fevereiro de 2021 15:02
  • Não sei fazer em powershell sou muito iniciante ai ainda.

    Em batch eu converteria os horários em segundos ex:

    Arquivo.txt = 04/02/2021 09:19
    Data Atual  = 04/02/2021 13:44

    Em segundos:

    Formula para horas: HH * 60 * 60

    Formula para Minutos MM * 60

    HH + MM

    Arquivo.txt = 33540
    Data Atual  = 49500
    10 Min      = 600

    Subtrair Segundos da data do arquivo da data atual:

    Resultado = 49500 - 33540 = 15960

    Se Resultado Maior que 600 Enviar Email

    No powershell deve ser mais fácil fazer isso mais eu só sei batch...tô começando em powershell ainda...

    Acho que em powershell seria algo assim:

    https://stackoverflow.com/questions/37521782/find-time-difference-in-minutes-using-a-powershell-script


    R. Bohner


    quinta-feira, 4 de fevereiro de 2021 16:52