none
Substituir arquivo RRS feed

  • Pergunta

  • Pessoal, bom dia.

    Tenho o script abaixo (que o Jesiel disponibilizou) que copia um arquivo de um determinado local no servidor para o Desktop da máquina. Porém, se o arquivo já existe ele substitui.
    Tem alguma forma de quando já existir o arquivo no local de destino ele deixar o arquivo existente e não efetuar a cópia?



    Set objNetwork = CreateObject("Wscript.Network")
    Set strFolder = CreateObject("Scripting.FileSystemObject")

    strOrigem = "\\servidor\pasta\arquivo"
    strCaminho =  "c:\Documents and Settings\All Users\Desktop"

    If strFolder.FolderExists (strCaminho) = False Then
       strFolder.CreateFolder (strCaminho)
       copiaArquivo strOrigem,strCaminho
    Else
       copiaArquivo strOrigem,strCaminho
    End If

    Sub CopiaArquivo(origem,Destino)

    strFolder.CopyFile origem , destino & "\" , true

    End Sub


    Obrigada

    Karina

    terça-feira, 22 de setembro de 2009 13:15

Respostas

  • Olá,

    Você teria que usar outra variável, conforme abaixo:


    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Coloque aqui a pasta que será verificada
    strPasta = "\\servidor\pasta\arquivo\"

    'Coloque aqui a pasta para a qual os arquivos serão copiados (Se quiser copiar, se nao quiser apague essa linha)
    strDest = "c:\Documents and Settings\All Users\Desktop\"

    'Coloque aqui o arquivo que é para substituir
    strCop = "arquivo1.txt,arquivo2.txt,arquivo3.txt"


    'Coloque aqui o arquivo que não é para substituir
    strArq = "arquivo4.txt"


    strCop = Split(strCop,",")
    Set objArq = ObjFSO.GetFolder(strPasta)
    Set MyFiles = objArq.files

    For Each MyFiles in objArq.Files
       For x = 0 to UBOUND(strCop)
          strFileOrig = Myfiles.path
          strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))

          if Myfiles.name = strCop(x) Then
             if (objFSO.FileExists(strFileDest) = True) Then
                if instr(Myfiles.name,strArq) = 0 Then
                   Set objFileDest = objFSO.GetFile(strFileDest)
                   objFSO.Copyfile strFileOrig,strFileDest,True
                End if
             Else
                objFSO.Copyfile strFileOrig,strFileDest,True
             End if
          End if
       Next
    Next



    Até mais,

    Jesiel

    Obs.: Se útil, classifique


    • Marcado como Resposta Karina Mior quinta-feira, 24 de setembro de 2009 14:16
    quarta-feira, 23 de setembro de 2009 18:06

Todas as Respostas

  • Efetuei uns testes, e na parte abaixo do script, alterando para "false" ele não substitui o arquivo. O problema é que vou ter um caso que vou precisar copiar uns 3 arquivos, porém só um deles que não vou poder substituir.
    Para copiar mais arquivos copiei o IF a quantidade de arquivos que preciso copiar. E deixei o "SUB" no final e está funcionando certinho.
    Teria algum jeito de colocar um sub para cada if??

    Obrigada

    Karina
    terça-feira, 22 de setembro de 2009 15:24
  • Olá,

    Não ficou muito claro sua necessidade...

    Você precisa copiar a pasta com os arquivos ou somente os arquivos???

    Talvez, seja interessante um script que copie de acordo com a data de modificação do arquivo (se a data de modificação da origem for maior que o destino, copia, se não for, não copia)


    Dá uma olhada no script abaixo:


    Set objNetwork = CreateObject("Wscript.Network")
    strUserName = objNetwork.Username

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Coloque aqui a pasta que será verificada
    strPasta = "\\servidor\pasta\arquivo "

    'Coloque aqui a pasta para a qual os arquivos serão copiados (Se quiser copiar, se nao quiser apague essa linha)
    strDest = "c:\Documents and Settings\All Users\Desktop\"


    ' NOME DO ARQUIVO DE LOG
    strLogFile = "C:\Documents and Settings\" & strUserName & "\Desktop\BACKUP-LOG.txt"


    arrTipos = split(arrTipos,";")
    Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True, 0)
    objLogFile.WriteLine  VBCRLF
    objLogFile.WriteLine "==================================================="
    objLogFile.WriteLine "ARQUIVOS COPIADOS EM: " & now
    objLogFile.WriteLine "==================================================="

    ChecaArquivo strPasta
    GeraLog(strPasta)
    wscript.quit




    Sub ChecaArquivo(strSubPasta)

    Set Folder = ObjFSO.GetFolder(strSubPasta)

    For each subFolder in Folder.SubFolders
       GeraLog SubFolder.Path
       ChecaArquivo SubFolder.path
    Next

    End sub



    '====================================================================

    Sub GeraLog(strCaminho)


    Set objArq = ObjFSO.GetFolder(strCaminho)
    Set MyFiles = objArq.files 

    For Each MyFiles in objArq.Files
       strFileOrig = Myfiles.path
       strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))

       if (objFSO.FileExists(strFileDest) = True) Then
          Set objFileDest = objFSO.GetFile(strFileDest)
          If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 0 Then

             objFSO.Copyfile strFileOrig,strFileDest,True
             objLogFile.WriteLine "ARQUIVO SUBSTITUIDO : "  & myfiles.name &  " copiado em : " & Now
          End if
       Else
          pastapai = MID(RIGHT(myFiles.ParentFolder,LEN(myFiles.ParentFolder)),Len(strPasta),Len(myFiles.ParentFolder))
          dirDest = strDest
          arrTipos = split(pastapai,"\")
          For x = 0 to UBOUND(arrTipos)
             if objFSO.folderexists(dirDest & arrTipos(x)) = false Then
               objFSO.CreateFolder(dirDest & arrTipos(x))
               dirDest = dirDest & arrTipos(x)
             Else
               dirDest = dirDest & arrTipos(x)
             End if
          Next

          objFSO.Copyfile strFileOrig,strFileDest,True
          objLogFile.WriteLine "ARQUIVO NOVO : "  & dirDest & myfiles.name &  " copiado em : " & Now
       End if
    Next
    End sub



    O script acima está copiando e gerando um log.... Talvez nem precisa, aí basta você remover as linhas...


    Até mais,

    Jesiel

    Obs.: Se útil, classifique





    terça-feira, 22 de setembro de 2009 16:00
  • Jesiel, boa tarde.

    Deixa eu tentar explicar melhor.
    Da forma que estou utilizando o script está funcionando perfeitamente. O que eu preciso copiar são apenas alguns arquivos dentro da pasta. Porém um desses arquivos eu só tenho que copiar se ele não existir no local de destino, se ele já existir não é para substituir.

    Pelos meus testes, a parte abaixo do script verifica se existe o arquivo e se existir dá um erro dizendo que o arquivo já existe e não copia (se estiver "false"). Se estiver "true" ele substitui o arquivo.
    A minha necessidade é copiar 3 arquivos de uma pasta para a área de trabalho, eu deixei 3 vezes o IF e uma vez no final o SUB. Então ele verifica se já existe ou não o arquivo no geral, nos três arquivos. O que eu preciso é separar isso, como se fosse colocar um SUB para cada IF.

    Sub CopiaArquivo(origem,Destino)
    strFolder.CopyFile origem , destino & "\" , false
    End Sub

    Não sei se deu para entender direito, é que sou nova nessas coisas de script...
    Obrigada
    Karina

    terça-feira, 22 de setembro de 2009 16:24
  • Olá,

    Verifique o script abaixo:


    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Coloque aqui a pasta que será verificada
    strPasta = "\\servidor\pasta\arquivo\ "

    'Coloque aqui a pasta para a qual os arquivos serão copiados (Se quiser copiar, se nao quiser apague essa linha)
    strDest = "c:\Documents and Settings\All Users\Desktop\"

    'Coloque aqui o arquivo que não é para substituir
    strArq = "arquivo3.txt"


    Set objArq = ObjFSO.GetFolder(strPasta)
    Set MyFiles = objArq.files 

    For Each MyFiles in objArq.Files
       strFileOrig = Myfiles.path
       strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))

       if (objFSO.FileExists(strFileDest) = True) Then
          if instr(Myfiles.name,strArq) = 0 Then
             Set objFileDest = objFSO.GetFile(strFileDest)
             objFSO.Copyfile strFileOrig,strFileDest,True
          End if
       Else
          objFSO.Copyfile strFileOrig,strFileDest,True
       End if
    Next



    Até mais,

    Jesiel

    Obs.: Se útil, classifique

    • Marcado como Resposta Karina Mior quarta-feira, 23 de setembro de 2009 13:57
    • Não Marcado como Resposta Karina Mior quarta-feira, 23 de setembro de 2009 14:07
    terça-feira, 22 de setembro de 2009 18:59
  • Jesiel, bom dia.

    Testei e funcionou perfeitamente!!!

    Muito obrigada... =D

    Até mais,

    Karina
    quarta-feira, 23 de setembro de 2009 13:57
  • Jesiel, só mais uma dúvida.

    A maioria das vezes que vou efetuar esse procedimento, eu copio apenas alguns arquivos da pasta e não todos os arquivos.
    Tem algum jeito de ao invés de selecionar um diretório para ele verificar, pedir para ele verificar apenas os arquivos que me interessam dentro dos diretórios? Sendo que um desses arquivos é o que não é para ser substituído.

    Obrigada
    quarta-feira, 23 de setembro de 2009 14:10
  • Olá,

    Você teria que usar outra variável, conforme abaixo:


    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    'Coloque aqui a pasta que será verificada
    strPasta = "\\servidor\pasta\arquivo\"

    'Coloque aqui a pasta para a qual os arquivos serão copiados (Se quiser copiar, se nao quiser apague essa linha)
    strDest = "c:\Documents and Settings\All Users\Desktop\"

    'Coloque aqui o arquivo que é para substituir
    strCop = "arquivo1.txt,arquivo2.txt,arquivo3.txt"


    'Coloque aqui o arquivo que não é para substituir
    strArq = "arquivo4.txt"


    strCop = Split(strCop,",")
    Set objArq = ObjFSO.GetFolder(strPasta)
    Set MyFiles = objArq.files

    For Each MyFiles in objArq.Files
       For x = 0 to UBOUND(strCop)
          strFileOrig = Myfiles.path
          strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))

          if Myfiles.name = strCop(x) Then
             if (objFSO.FileExists(strFileDest) = True) Then
                if instr(Myfiles.name,strArq) = 0 Then
                   Set objFileDest = objFSO.GetFile(strFileDest)
                   objFSO.Copyfile strFileOrig,strFileDest,True
                End if
             Else
                objFSO.Copyfile strFileOrig,strFileDest,True
             End if
          End if
       Next
    Next



    Até mais,

    Jesiel

    Obs.: Se útil, classifique


    • Marcado como Resposta Karina Mior quinta-feira, 24 de setembro de 2009 14:16
    quarta-feira, 23 de setembro de 2009 18:06
  • Jesiel, bom dia!

    Era isso mesmo que eu precisava!!!
    Muito obrigada mesmo!!

    bj

    Karina
    quinta-feira, 24 de setembro de 2009 14:17
  • Jesiel, e se eu quiser, copiar dois arquivos para dois destinos diferentes. Como eu faria?

    -- Wesley Wilson Fernandes de Almeida Tecnólogo em Sistemas para Internet Desenvolvimento de Sites e Aplicações Web Técnico em Informática Venda, manutenção e suporte de microcomputadores, notebooks, impressoras e redes. Contato: E-mail: wesleyrnn@gmail.com Skype: wesleyrnn@outlook.com


    quarta-feira, 24 de junho de 2015 23:48
  • Estou iniciando em scripts e dai preciso saber até mesmo qual a extensão. Seria .vbs? 

    Aqui pra mim está apresentando um erro, dizendo q o parâmetro está incorreto. Estou utilizando um ambiente de testes com o Windows Server 2012 e um cliente Windows 8.1 Pro  64


    -- Wesley Wilson Fernandes de Almeida Tecnólogo em Sistemas para Internet Desenvolvimento de Sites e Aplicações Web Técnico em Informática Venda, manutenção e suporte de microcomputadores, notebooks, impressoras e redes. Contato: E-mail: wesleyrnn@gmail.com Skype: wesleyrnn@outlook.com

    quinta-feira, 25 de junho de 2015 00:08