none
Bat para copiar arquivos alterados para um diretorio novo RRS feed

  • Pergunta

  • Bom dia amigos,

    Estou usando a bat abaixo para fazer copia de arquivos alterados as não está funcionando da forma prevista

    O fato é que simplesmente ele copia a mesma coisa, pois fiz um teste no sabado e no domingo que não tem modificação nos arquivos, e mesmo assim a copia foi feita.

    Esta bat nos ajuda pois cria um diretorio ano e dentro do diretorio ano o diretorio mes e dentro do diretorio mes os dias deste mes... sendo que os arquivos estão iguais, não mudou nada.

    Alguem pode ajudar ??

    @echo off

    set dia=%date:~0,2%
    set mes=%date:~3,2%
    if %mes%==01 set mes=Jan
    if %mes%==02 set mes=Fev
    if %mes%==03 set mes=Mar
    if %mes%==04 set mes=Abr
    if %mes%==05 set mes=Mai
    if %mes%==06 set mes=Jun
    if %mes%==07 set mes=Jul
    if %mes%==08 set mes=Ago
    if %mes%==09 set mes=Set
    if %mes%==10 set mes=Out
    if %mes%==11 set mes=Nov
    if %mes%==12 set mes=Dez
    set ano=%date:~6,4%
     

    md "D:\"minha pasta de destino"\%ano%\%mes%\%dia%"
     
    set pasta_origem=D:\pasta de origem
    set pasta_destino="D:\pasta de destino\%ano%\%mes%\%dia%"
     

    xcopy "%pasta_origem%" "%pasta_destino%" /d /e /c /i /h /r /k /y

    Fabio Aragao

    quarta-feira, 7 de outubro de 2015 12:23

Todas as Respostas

  • Boa noite Fabio,

    Não entendi muito bem o que você quer, supus que você quer criar uma pasta onde  efetue a cópia de arquivos  com a estrutura de diretório  de  "Ano/Mes/Dia" baseado na data de modificação do arquivo, sendo assim fiz esse script abaixo, em VBScript, copie e cole o cod em um notepad e salve com a extensão ".vbs" (ex. CopiaArquivo.vbs).

    Faça um teste e veja se é isso mesmo.


    Set oFSO = CreateObject("Scripting.FileSystemObject")
    
    sFolderDestino = "D:\pasta de origem"
    sFolderOrigem = "D:\pasta de destino"
    
    '*** Se a pasta destino não existir, cria
    If Not oFSO.FolderExists(sFolderDestino) Then
    	oFSO.CreateFolder(sFolderDestino)
    End IF
    
    '*** Pesquisa a pasta destino
    Set oFolder = oFSO.getFolder(sFolderOrigem)
    	For Each ofile in oFolder.files
    		'*** a cada arquivo encontrado, verifica a data de modificação e separa por dia,mes,ano
    		sDia = DatePart("d", ofile.DateLastModified)
    		sMes = uCase(MonthName(DatePart("M", ofile.DateLastModified),true))
    		sAno = DatePart("YYYY", ofile.DateLastModified)
    
    		If sDia < 10 Then sDia = "0" & sDia
    		'*** Cria a pasta ano
    		If Not oFSO.FolderExists(sFolderDestino & "\" & sAno) Then
    			oFSO.CreateFolder(sFolderDestino & "\" & sAno)
    		End IF
    		'*** Cria a pasta mes
    		If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes) Then
    			oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes)
    		End IF
    		'*** Cria a pasta dia
    		If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes & "\"& sDia) Then
    			oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia)
    		End IF
    		'*** Se o arquivo ja existe na pasta destino não copia novamente
    		If Not oFSO.FileExists(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\" & ofile.name) then
    			oFSO.CopyFile ofile, sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\",True
    		End If
    	Next
    wscript.echo "Finalizado"

     


    att, Aparecido Deveza

    sábado, 10 de outubro de 2015 02:07
  • Boa noite.

    Uso ROBOCOPY para copiar arquivos, ele também compara os arquivos e copia somente os que tiveram alguma alteração.

    Exemplos de scripts:

    http://www.wellingtonagapto.org/2012/08/exemplos-de-scripts-para-robocopy.html

    http://www.andersonpatricio.org/copiando-dados-com-o-robocopy/

    Documentação  MS:

    https://technet.microsoft.com/pt-br/library/cc733145%28v=ws.10%29.aspx

    ----

    Caso resolveu seu problema, marque como resposta. Vote se for útil.

    • Sugerido como Resposta Joao Macedo terça-feira, 13 de outubro de 2015 12:09
    sábado, 10 de outubro de 2015 02:22
  • Boa noite Fabio,

    Não entendi muito bem o que você quer, supus que você quer criar uma pasta onde  efetue a cópia de arquivos  com a estrutura de diretório  de  "Ano/Mes/Dia" baseado na data de modificação do arquivo, sendo assim fiz esse script abaixo, em VBScript, copie e cole o cod em um notepad e salve com a extensão ".vbs" (ex. CopiaArquivo.vbs).

    Faça um teste e veja se é isso mesmo.


    Set oFSO = CreateObject("Scripting.FileSystemObject")
    
    sFolderDestino = "D:\pasta de origem"
    sFolderOrigem = "D:\pasta de destino"
    
    '*** Se a pasta destino não existir, cria
    If Not oFSO.FolderExists(sFolderDestino) Then
    	oFSO.CreateFolder(sFolderDestino)
    End IF
    
    '*** Pesquisa a pasta destino
    Set oFolder = oFSO.getFolder(sFolderOrigem)
    	For Each ofile in oFolder.files
    		'*** a cada arquivo encontrado, verifica a data de modificação e separa por dia,mes,ano
    		sDia = DatePart("d", ofile.DateLastModified)
    		sMes = uCase(MonthName(DatePart("M", ofile.DateLastModified),true))
    		sAno = DatePart("YYYY", ofile.DateLastModified)
    
    		If sDia < 10 Then sDia = "0" & sDia
    		'*** Cria a pasta ano
    		If Not oFSO.FolderExists(sFolderDestino & "\" & sAno) Then
    			oFSO.CreateFolder(sFolderDestino & "\" & sAno)
    		End IF
    		'*** Cria a pasta mes
    		If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes) Then
    			oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes)
    		End IF
    		'*** Cria a pasta dia
    		If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes & "\"& sDia) Then
    			oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia)
    		End IF
    		'*** Se o arquivo ja existe na pasta destino não copia novamente
    		If Not oFSO.FileExists(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\" & ofile.name) then
    			oFSO.CopyFile ofile, sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\",True
    		End If
    	Next
    wscript.echo "Finalizado"

     


    att, Aparecido Deveza

    Bom dia Aparecido, obrigado por responder.

    O que eu preciso fazer é copiar para um outro diretório B apenas o que foi modificado no diretório A, para ser mais especifico, o pessoal do desenvolvimento faz alterações nos arquivos fontes, com isso alguns executáveis são alterados ao decorrer do dia, no final do dia faz-se o backup do dia e no outro dia podem fazer alterações sem problemas pois o que foi feito no dia anterior, e está funcionando, está a salvo em outro diretório.

    Se os caras fizeram alguma modificação que não der certo, basta ir no diretório do dia especifico e pegar o projeto e rever o código.


    Fabio Aragao

    terça-feira, 13 de outubro de 2015 11:50
  • Boa noite Fabio,  de nada, rs :)

    Agora entendi, bom acrescentei um "If DateDiff("d", ofile.DateLastModified, Now) < 1", que só entrará a condição de cópia se a data de modificação do arquivo for menor que 1 dia, você pode mudar essa condição para minuto, hora, dia, semana,mês ou ano se preferir.... datediff

    Teste novamente, por favor.

    On Error Resume Next
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    
    sFolderDestino = "D:\pasta de origem"
    sFolderOrigem = "D:\pasta de destino"
    
    '*** Se a pasta destino não existir, cria
    If Not oFSO.FolderExists(sFolderDestino) Then
    	oFSO.CreateFolder(sFolderDestino)
    End IF
    
    '*** Pesquisa a pasta destino
    Set oFolder = oFSO.getFolder(sFolderOrigem)
    	For Each ofile in oFolder.files
    		'*** Verifica se a data de modificação é menor que 1 dia, se for efetua a cópia.
    		If DateDiff("d", ofile.DateLastModified, Now) < 1 Then
    			'*** a cada arquivo encontrado, verifica a data de modificação e separa por dia,mes,ano
    			sDia = DatePart("d", ofile.DateLastModified)
    			sMes = uCase(MonthName(DatePart("M", ofile.DateLastModified),true))
    			sAno = DatePart("YYYY", ofile.DateLastModified)
    			If sDia < 10 Then sDia = "0" & sDia
    			'*** Cria a pasta ano
    			If Not oFSO.FolderExists(sFolderDestino & "\" & sAno) Then
    				oFSO.CreateFolder(sFolderDestino & "\" & sAno)
    			End IF
    			'*** Cria a pasta mes
    			If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes) Then
    				oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes)
    			End IF
    			'*** Cria a pasta dia
    			If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes & "\"& sDia) Then
    				oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia)
    			End IF
    			'*** Se o arquivo ja existe na pasta destino não copia novamente
    			If Not oFSO.FileExists(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\" & ofile.name) then
    				oFSO.CopyFile ofile, sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\",True
    			End If
    		End If
    	Next
    wscript.echo "Finalizado"





    att, Aparecido Deveza

    quarta-feira, 14 de outubro de 2015 01:23
  • Boa noite.

    Uso ROBOCOPY para copiar arquivos, ele também compara os arquivos e copia somente os que tiveram alguma alteração.

    Exemplos de scripts:

    http://www.wellingtonagapto.org/2012/08/exemplos-de-scripts-para-robocopy.html

    http://www.andersonpatricio.org/copiando-dados-com-o-robocopy/

    Documentação  MS:

    https://technet.microsoft.com/pt-br/library/cc733145%28v=ws.10%29.aspx

    ----

    Caso resolveu seu problema, marque como resposta. Vote se for útil.

    Carlos, obrigado por responder e me perdoe por não postar um visto na sua resposta antes.. mas estou testando a opção do amigo Aparecido primeiramente...

    Fabio Aragao

    quarta-feira, 14 de outubro de 2015 17:53
  • Boa tarde Aparecido,

    Vou testar hoje a noite... amanha posto o resultado.

    Obrigado


    Fabio Aragao

    quarta-feira, 14 de outubro de 2015 18:06
  • Presumindo que eu tenha uma tarefa para ser executada todos os dias a noite às 23:00, o código em PowerShell abaixo:

    • criaria hoje o diretório C:\_TargetFolder\2015\10\14 caso não exista.
    • listaria somente arquivos no diretório C:\_SourceFiles que tenham sua última data de escrita hoje e,
    • copiaria estes para C:\_TargetFolder\2015\10\14.
    $BackupFolder = "C:\_TargetFolder"
    $DestinationFolder = (Get-Date).ToString("yyyy") + "\" + (Get-Date).ToString("MMM") + "\" + (Get-Date).ToString("dd")
    $SourceFiles = "C:\_SourceFolder"
    If (!(Test-Path "$BackupFolder\$DestinationFolder")) {
        New-Item "$BackupFolder\$DestinationFolder" -Type Directory
        $FilesToMove = Get-ChildItem $SourceFiles | ? {($_.LastWriteTime).ToString("dd/MM/yyyy") -eq (Get-Date).ToString("dd/MM/yyyy") -and $_.Attributes -ne "Directory"}
        If ($FilesToMove) {
            ForEach ($File in $FilesToMove) {
                Copy-Item $File.FullName "$BackupFolder\$DestinationFolder"
            }
        }
    }
    Else {
        $FilesToMove = Get-ChildItem $SourceFiles | ? {($_.LastWriteTime).ToString("dd/MM/yyyy") -eq (Get-Date).ToString("dd/MM/yyyy") -and $_.Attributes -ne "Directory"}
        If ($FilesToMove) {
            ForEach ($File in $FilesToMove) {
                Copy-Item $File.FullName "$BackupFolder\$DestinationFolder"
            }
        }
    }

    quarta-feira, 14 de outubro de 2015 21:47
  • Boa noite Fabio,  de nada, rs :)

    Agora entendi, bom acrescentei um "If DateDiff("d", ofile.DateLastModified, Now) < 1", que só entrará a condição de cópia se a data de modificação do arquivo for menor que 1 dia, você pode mudar essa condição para minuto, hora, dia, semana,mês ou ano se preferir.... datediff

    Teste novamente, por favor.

    On Error Resume Next
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    
    sFolderDestino = "D:\pasta de origem"
    sFolderOrigem = "D:\pasta de destino"
    
    '*** Se a pasta destino não existir, cria
    If Not oFSO.FolderExists(sFolderDestino) Then
    	oFSO.CreateFolder(sFolderDestino)
    End IF
    
    '*** Pesquisa a pasta destino
    Set oFolder = oFSO.getFolder(sFolderOrigem)
    	For Each ofile in oFolder.files
    		'*** Verifica se a data de modificação é menor que 1 dia, se for efetua a cópia.
    		If DateDiff("d", ofile.DateLastModified, Now) < 1 Then
    			'*** a cada arquivo encontrado, verifica a data de modificação e separa por dia,mes,ano
    			sDia = DatePart("d", ofile.DateLastModified)
    			sMes = uCase(MonthName(DatePart("M", ofile.DateLastModified),true))
    			sAno = DatePart("YYYY", ofile.DateLastModified)
    			If sDia < 10 Then sDia = "0" & sDia
    			'*** Cria a pasta ano
    			If Not oFSO.FolderExists(sFolderDestino & "\" & sAno) Then
    				oFSO.CreateFolder(sFolderDestino & "\" & sAno)
    			End IF
    			'*** Cria a pasta mes
    			If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes) Then
    				oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes)
    			End IF
    			'*** Cria a pasta dia
    			If Not oFSO.FolderExists(sFolderDestino & "\" & sAno & "\" & sMes & "\"& sDia) Then
    				oFSO.CreateFolder(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia)
    			End IF
    			'*** Se o arquivo ja existe na pasta destino não copia novamente
    			If Not oFSO.FileExists(sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\" & ofile.name) then
    				oFSO.CopyFile ofile, sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\",True
    			End If
    		End If
    	Next
    wscript.echo "Finalizado"





    att, Aparecido Deveza

    Bom dia amigo,

    Não funcionou.. fiz as alterações de diretorio para adequar ao meu cenário mas não fez....

    Inseri e exclui arquivos dentro de diretorios e so exibe uma mensagem "finalizado"


    Fabio Aragao

    sexta-feira, 16 de outubro de 2015 11:23
  • Bom dia!

    Obrigado pela citação, também estou precisando copiar arquivos criados automaticamente em uma pasta a cada dia, para um outro destino. Esse script serve para verificar se o arquivo foi criado no dia, e copiar para a pasta de origem.

    Se o script não servir, seria ideal utilizar o NTbackup.

    quarta-feira, 25 de janeiro de 2017 10:26
  • boa tarde,

    possuo um problema semelhante, só que o meu consiste em copiar a pasta de um diretório separado por dia no modelo z://2017-06-02 para um diretório apenas de arquivo z://arquivos, atualmente estou usando o robocopy mas ele me copia todo os diretorados, necessito apenas que ele copie os arquivos e não estruturara de pastas.

    robocopy "z:\\servidor\PorData" "z:\\arquivos" *.xml /A /MAXAGE:20170601 /MINAGE:20170602

    realizo dentro do script o filtro por data dos arquivos, mas o ideal seria que o próprio script entendesse que preciso sempre importar os arquivos da pasta que foram criados ou editados com data do dia anterior.

    sexta-feira, 2 de junho de 2017 19:01
  • Boa noite Fabio,

    Não entendi muito bem o que você quer, supus que você quer criar uma pasta onde  efetue a cópia de arquivos  com a estrutura de diretório  de  "Ano/Mes/Dia" baseado na data de modificação do arquivo, sendo assim fiz esse script abaixo, em VBScript, copie e cole o cod em um notepad e salve com a extensão ".vbs" (ex. CopiaArquivo.vbs).

    Faça um teste e veja se é isso mesmo.


    Defina oFSO = CreateObject ( "Scripting.FileSystemObject" )
    
    sFolderDestino = "D:\pasta de origem"
    sFolderOrigem = "D:\pasta de destino"
    
    '*** Se a pasta destino não existir, criaSe não for oFSO.FolderExists (sFolderDestino) EntãooFSO.CreateFolder (sFolderDestino)Fim se
    
    '*** Pesquisa a pasta destinoDefina oFolder = oFSO.getFolder (sFolderOrigem)Para cada arquivo em oFolder.files
    		'*** a cada arquivo encontrado, verifica a data de modificação e separa por dia,mes,anosDia = DatePart ("d", ofile.DateLastModified)sMes = uCase (MonthName (DatePart ("M", ofile.DateLastModified), true )) sAno = DatePart ( "YYYY" , ofile . DateLastModified )
    
    		If sDia < 10 Then sDia = "0" & sDia
    		 '*** Cria uma pasta ano If Not oFSO . FolderExists ( sFolderDestino & "\" & sAno ) Em seguida, oFSO . CreateFolder ( sFolderDestino & "\" & sAno ) End IF '*** Cria uma pasta mes If Not oFSO . FolderExists ( sFolderDestino &"\" &    
    		      
    		 
    		
    		   & "\" & sMes ) Então oFSO . CreateFolder ( sFolderDestino & "\" & sAno & "\" & sMes ) End IF '*** Cria a pasta dia If Not oFSO . FolderExists ( sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia ) Em seguida,       
    		 
    		
    		       & "\" & sAno & "\" & sMes & "\" & sDia ) End IF '*** Se o arquivo ja existe na pasta destino não copia novamente If Not oFSO . FileExists ( sFolderDestino & "\" & sAno & "\" & sMes & "\" & sDia & "\" & ofile .      
    		 
    		
    		          & "\" & sAno & "\" & sMes & "\" & sDia & "\" , True End If Next wscript . echo "Finalizado"       
    		 
    	

     


    att, Aparecido Deveza

    Poderia me ajudar em uma coisa nessa seu VBS?

    Queria que ao invés dele criar as pastas, ele pegasse todos arquivos e colocassem na pasta de destino. Ele continua fazendo todas verificações mas salta todos diretamente na pasta de destino, sem criar sub-pastas.

    Um exemplo: Pasta de destino RDF Unificado.

    Ele verifica na pasta de origem todos arquivos e qnd identificar joga todos na pasta RDF Unificado

    quarta-feira, 9 de setembro de 2020 17:24