Usuário com melhor resposta
Substituir arquivo

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 IfSub CopiaArquivo(origem,Destino)
strFolder.CopyFile origem , destino & "\" , true
End Sub
Obrigada
Karina
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
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 -
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
-
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 -
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
-
-
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 -
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
-
-
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
- Editado Wesley Wilson F. de Almeida 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