Usuário com melhor resposta
Copia de arquivo.

Pergunta
-
Bom dia,
1º Estou querendo um script que copia arquivos criado no dia, pois a cada dia é gerado um arquivo, mas nesta pasta tem varios arquivos, começando com TESTE_xxx.txt, EXECUTANDO_xxx.TXT, no caso só gostaria que verificasse os arquivos que inicie somente com "EXECUTANDO", o script que tenho só verifica as extensões, mas pelo nome não sei como fazer.
2º O computador de destino não está no dominio, então terá que especificar usuário e senha (ciente em relação a segurança).
O script que tenho é este:
set objNetwork = CreateObject("Wscript.Network")
strUserName = objNetwork.UsernamestrComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")'Coloque aqui a pasta que será verificada (AQUI COLOQUEI O CAMINHO ONDE ESTÁ OS ARQUIVOS)
strPasta = "\\\192.168.0.1.\teste\"
'Coloque aqui a pasta para a qual os arquivos serão copiados (AQUI COLOQUEI O CAMINHO ONDE É PARA ENVIAR)
strDest = \\192.168.20.15\backup
' NOME DO ARQUIVO DE LOG
strLogFile = "C:\IND_SP\IND_SP.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
'wscript.echo "Fim do Script"
'wscript.quitSub ChecaArquivo(strSubPasta)
Set Folder = ObjFSO.GetFolder(strSubPasta)
GeraLog strSubPasta
LimpaDel strSubPastaFor each subFolder in Folder.SubFolders
GeraLog SubFolder.Path
LimpaDel SubFolder.path
ChecaArquivo SubFolder.path
NextEnd sub
'====================================================================
Sub GeraLog(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesFor 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) > 1 ThenobjFSO.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' WSCRIPT.ECHO "NAO EXISTE"
objFSO.Copyfile strFileOrig,strFileDest,True
objLogFile.WriteLine "ARQUIVO NOVO : " & dirDest & myfiles.name & " copiado em : " & Now
End if
Next
End sub'====================================================================
Sub LimpaDel(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesFor Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))if not (objFSO.FileExists(strFileDest) = True) Then
objLogFile.WriteLine "ARQUIVO DELETADO : " & dirDest & myfiles.name & " em : " & Now
End if
Next
End sub(ESSE NÃO ME ATENDE PARA ESSA SOLICITAÇÃO).
Agradeço desde já a força.
Respostas
-
Olá,
Muda a linha:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 and DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) <= 2 Then
Para:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) = 1 Then
Até mais,
Jesiel
Obs.: Se útil, classifique
- Marcado como Resposta Rafael S. AMARAL terça-feira, 20 de abril de 2010 13:40
Todas as Respostas
-
-
Olá,
Modifique a Sub abaixo:
'====================================================================
Sub GeraLog(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.files
strPalavra = "executando"
For Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))
if instr(UCASE(Myfiles.name),UCASE(strPalavra)) > 0 Then
wscript.echo Myfiles.name
if (objFSO.FileExists(strFileDest) = True) Then
Set objFileDest = objFSO.GetFile(strFileDest)
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 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
End if
Next
End sub
'====================================================================Até mais,
Jesiel
Obs.: Se útil, classifique
-
Bom dia Jesiel,
Primeiramente obrigado pela força.
O script está funcionando, gostaria de saber se é possível colocar um usuário e senha nele, pois o destino não está no domínio. (provavelmente um local\user password:xxxxxxx).
Tem como também configurar que ele só traga pelo menos 2 dias, ele traz todos e é quase 2 GB de arquivos. (Os dois últimos dias é o suficiente).
Outra coisa, tem como tirar a mensagem no final do script ? (ele. aparece os nomes dos arquivos que foram copiados, acho desnecessário pelo fato de ter o log).
Obrigado desde já.
-
Olá,
Basta remover a linha:
wscript.echo Myfiles.name
E para fazer somente com 2 ultimos dias altere a linha:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 Then
Para:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 and DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) <= 2 Then
Faça os testes e nos retorne.
Até mais,
Jesiel
Obs.: Se útil, classifique
-
Olá,
Basta remover a linha:
wscript.echo Myfiles.name
E para fazer somente com 2 ultimos dias altere a linha:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 Then
Para:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 and DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) <= 2 Then
Faça os testes e nos retorne.
Até mais,
Jesiel
Obs.: Se útil, classifique
Então com isso se tiver arquivos TESTE.txt com data de dois dias e outros com 1 mês de idade, ele só vai trazer com a data de 2 dias ?Referente a senha é possível ?, pois se não der, acho que será em vão, pois como ja havia dito, a maquina origem está fora do domínio.
Outro detalhe: Estou fazendo um ambiente teste aqui e executei esse script e apareceu no log como arquivo deletado, (ESTÁ SENDO DELETADO ALGO?)
S C R I P T
Set objNetwork = CreateObject("Wscript.Network")
strUserName = objNetwork.UsernamestrComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")'Coloque aqui a pasta que será verificada (AQUI COLOQUEI O CAMINHO ONDE O PESSOAL VAI TRABALHAR DURANTE O DIA - AQUI É A FILIAL)
strPasta = "\\192.68.0.15\c$\Documents and Settings\user\My Documents\PGP\"'Coloque aqui a pasta para a qual os arquivos serão copiados (AQUI COLOQUEI O CAMINHO ONDE É PARA ESTAR DE ACORDO COM O QUE FOI FEITO DURANTE O DIA NA FILIAL- AQUI É A MATRIZ)
strDest = "\\192.168.0.2\teste\"
' NOME DO ARQUIVO DE LOG
strLogFile = "c:\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
'wscript.echo "Fim do Script"
'wscript.quitSub ChecaArquivo(strSubPasta)
Set Folder = ObjFSO.GetFolder(strSubPasta)
GeraLog strSubPasta
LimpaDel strSubPastaFor each subFolder in Folder.SubFolders
GeraLog SubFolder.Path
LimpaDel SubFolder.path
ChecaArquivo SubFolder.path
NextEnd sub
'====================================================================
Sub GeraLog(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesstrPalavra = "teste"
For Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))
if instr(UCASE(Myfiles.name),UCASE(strPalavra)) > 0 Then
wscript.echo Myfiles.name
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
NextobjFSO.Copyfile strFileOrig,strFileDest,True
objLogFile.WriteLine "ARQUIVO NOVO : " & dirDest & myfiles.name & " copiado em : " & Now
End if
End if
Next
End sub
'====================================================================Sub LimpaDel(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesFor Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))if not (objFSO.FileExists(strFileDest) = True) Then
objLogFile.WriteLine "ARQUIVO DELETADO : " & dirDest & myfiles.name & " em : " & Now
End if
Next
End subL O G
===================================================
ARQUIVOS COPIADOS EM: 26/03/2010 11:07:37
===================================================
ARQUIVO DELETADO : PGP3D.pkr em : 26/03/2010 11:07:38
ARQUIVO DELETADO : PGP3D.skr em : 26/03/2010 11:07:38
ARQUIVO DELETADO : pubring-bak.pkr em : 26/03/2010 11:07:38
ARQUIVO DELETADO : pubring.pkr em : 26/03/2010 11:07:38
ARQUIVO DELETADO : secring-bak.skr em : 26/03/2010 11:07:38
ARQUIVO DELETADO : secring.skr em : 26/03/2010 11:07:39 -
Olá,
É que o ultimo sub (limpadel) seria para deletar os arquivos que existem na pasta destino e não existe mais na pasta origem.
Mas não tem a ação de deletar. só esta gerando o log.
Você pode remover este sub e remover também a chamada dele na linha:
LimpaDel SubFolder.path
Acredito, que para executar em outra maquina, o melhor seria utilizar o runas.
Verifique no link abaixo onde eu postei um script .hta para usar o runas.http://social.technet.microsoft.com/Forums/pt-BR/scriptadminpt/thread/ce62c44e-3500-4968-afe7-a9e2d2dcf7fe
Até mais,
Jesiel
Obs.: Se útil, classifique
-
-
Olá,
Você vai colocar a senha no script?
É uma falha de segurança, mas você pode usar o runas em vbs:
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "runas /user:COMPUTER\usuario ""script.vbs"""
WScript.Sleep 100
oShell.Sendkeys "senha~"
Wscript.QuitAté mais,
Jesiel
Obs.: Se útil, classifique
-
No momento vou colocar sim, voou transformálo em VBE (td bem que é facil de quebrar)
Esse script eu coloco no começo ? e ficaria assim ?
''''INICIA AQUI''''
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "runas /user:192.168.0.2\RAFAEL ""script.vbs""" (esse script.vbs seria o nome do meu?)
WScript.Sleep 100
oShell.Sendkeys "123456~"
Wscript.QuitSet objNetwork = CreateObject("Wscript.Network")
strUserName = objNetwork.UsernamestrComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")'Coloque aqui a pasta que será verificada (AQUI COLOQUEI O CAMINHO ONDE O PESSOAL VAI TRABALHAR DURANTE O DIA - AQUI É A FILIAL)
strPasta = "\\10.8.1.89\d$\Teste1\"'Coloque aqui a pasta para a qual os arquivos serão copiados (AQUI COLOQUEI O CAMINHO ONDE É PARA ESTAR DE ACORDO COM O QUE FOI FEITO DURANTE O DIA NA FILIAL- AQUI É A MATRIZ)
strDest = "\\10.8.2.36\teste\"
' NOME DO ARQUIVO DE LOG
strLogFile = "c:\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
'wscript.echo "Fim do Script"
'wscript.quitSub ChecaArquivo(strSubPasta)
Set Folder = ObjFSO.GetFolder(strSubPasta)
GeraLog strSubPasta
LimpaDel strSubPastaFor each subFolder in Folder.SubFolders
GeraLog SubFolder.Path
LimpaDel SubFolder.path
ChecaArquivo SubFolder.path
NextEnd sub
'====================================================================
Sub GeraLog(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesstrPalavra = "teste"
For Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))
if instr(UCASE(Myfiles.name),UCASE(strPalavra)) > 0 Then
wscript.echo Myfiles.name
if (objFSO.FileExists(strFileDest) = True) Then
Set objFileDest = objFSO.GetFile(strFileDest)
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 and DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) <= 2 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
NextobjFSO.Copyfile strFileOrig,strFileDest,True
objLogFile.WriteLine "ARQUIVO NOVO : " & dirDest & myfiles.name & " copiado em : " & Now
End if
End if
Next
End sub
'====================================================================Sub LimpaDel(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesFor Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))if not (objFSO.FileExists(strFileDest) = True) Then
objLogFile.WriteLine "ARQUIVO DELETADO : " & dirDest & myfiles.name & " em : " & Now
End if
Next
End sub
''''TERMINA AQUI'''' -
Bom dia Jesiel,
Poderia me informar onde coloco o runas, conforme a citação em cima, está correto?
Outro detalhe: O Script abaixo ainda continua trazendo arquivos com datas com mais de 2 dias (Exemplo: Está vindo arquivo de 2009 ainda)
Set objNetwork = CreateObject("Wscript.Network")
strUserName = objNetwork.UsernamestrComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")'Coloque aqui a pasta que será verificada (AQUI COLOQUEI O CAMINHO ONDE O PESSOAL VAI TRABALHAR DURANTE O DIA - AQUI É A FILIAL)
strPasta = ''\\192.168.25.30\teste2'''Coloque aqui a pasta para a qual os arquivos serão copiados (AQUI COLOQUEI O CAMINHO ONDE É PARA ESTAR DE ACORDO COM O QUE FOI FEITO DURANTE O DIA NA FILIAL- AQUI É A MATRIZ)
strDest = "\\10.8.2.36\teste\"
' NOME DO ARQUIVO DE LOG
strLogFile = "c:\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
'wscript.echo "Fim do Script"
'wscript.quitSub ChecaArquivo(strSubPasta)
Set Folder = ObjFSO.GetFolder(strSubPasta)
GeraLog strSubPasta
LimpaDel strSubPastaFor each subFolder in Folder.SubFolders
GeraLog SubFolder.Path
LimpaDel SubFolder.path
ChecaArquivo SubFolder.path
NextEnd sub
'====================================================================
Sub GeraLog(strCaminho)
Set objArq = ObjFSO.GetFolder(strCaminho)
Set MyFiles = objArq.filesstrPalavra = "PRECOS"
For Each MyFiles in objArq.Files
strFileOrig = Myfiles.path
strFileDest = strDest & MID(MyFiles.path,Len(strPasta),Len(Myfiles.path))
if instr(UCASE(Myfiles.name),UCASE(strPalavra)) > 0 Then
'wscript.echo Myfiles.name
if (objFSO.FileExists(strFileDest) = True) Then
Set objFileDest = objFSO.GetFile(strFileDest)
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 and DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) <= 2 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
NextobjFSO.Copyfile strFileOrig,strFileDest,True
objLogFile.WriteLine "ARQUIVO NOVO : " & dirDest & myfiles.name & " copiado em : " & Now
End if
End if
Next
End sub -
-
Bom dia Jesiel,
Estamos muito perto de finalizar, consegui jogar para outro local que está no dominio, com isso nao preciso mais do RUNAS.
Coloquei o nome TESTE, mas ainda continua trazendo arquivos antigos.
Para finalizar, como eu poderia configurar então para trazer SOMENTE arquivo criado no dia, esse arquivo é criado automaticamente sempre de madrugada (02:30 AM), estou pensando entao executar esse script sempre as 05:00 AM (mas tem que trazer somente o arquivo deste dia), TEM COMO?
-
Olá,
Muda a linha:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) > 1 and DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) <= 2 Then
Para:
If DateDiff("d",objFileDest.DateLastModified,myfiles.DateLastModified) = 1 Then
Até mais,
Jesiel
Obs.: Se útil, classifique
- Marcado como Resposta Rafael S. AMARAL terça-feira, 20 de abril de 2010 13:40