Usuário com melhor resposta
Script .VBS para atualizar arquivos em servidor FTP

Pergunta
-
Boa tarde a todos!
Tenho alguns arquivos aqui na empresa, que são gerados diariamente, e que eu os disponibilizo via WEB através do site da empresa. Para isto, tenho que colocar os arquivos em uma pasta FTP, no local onde o meu site está hospedado. A minha hospadagem é terceirizada. Eu preciso criar um script para copiar os arquivos diariamente para a pasta no servidor ftp. Tentei fazer com um arquivo em .bat, mas o grande problema é que o comando MPUT do ftp não permite parâmetros para copiar apenas os arquivos mais novos, que nem o XCOPY permite. Eu tentei de diversas formas com scripts em .bat e em .vbs, mas não consegui fazer a transferencia "incremental" de arquivos.
Sei também que o comando FTP /D:data me permite informar a data dos arquivos que quero, mas a questão é que eu preciso que rode automaticamente, sem ser necessária a minha intervenção para informar a data.
Desde já agradeço pela ajuda e pela atenção de todos!
- Editado Fábio JrModerator sexta-feira, 19 de outubro de 2012 20:07 Título
Respostas
-
o $file não pode usar o *.xml, vai ter que ser o nome do arquivo ou você pode trocar o codigo
Foreach($File in (Get-ChildItem "D:\TESTE55\*.xml")){ $ftp = "ftp://usuario:senha@meudominio.com.br/teste/" $webclient = New-Object System.Net.WebClient $uri = New-Object System.Uri($ftp) $webclient.UploadFile($uri, $File.Fullname) }
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki- Marcado como Resposta Thiago_Baptista terça-feira, 23 de outubro de 2012 17:01
-
Fiz uma modificação que fica fácil ver o que está sendo feito.
Fiz algumas alterações, coloque seus dados novamente e tente.
strFolder = "c:\temp" 'A pasta onde estão os arquivos para enviar strFTPUser = "teste" 'Usuário do FTP strFTPSenha="abc123" 'Senha do FTP strFTPScript="C:\Temp\COMANDOS_FTP.txt" 'Arquivo com os comandos FTP, ele será criado strFTPDestino="ftp.meudominio.com.br/teste" 'Destino dos arquivos strDataCorte = date() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("WScript.Shell") ''# Directory to scan Set objFolder = objFSO.GetFolder(strFolder) 'Inicia a criação do arquivo de script Set objTextFile = objFSO.OpenTextFile(strFTPScript, 2, True)'2=ForWriting objTextFile.WriteLine(strFTPUser) objTextFile.WriteLine(strFTPSenha) 'Aqui ele vai entrar e verificar quais são os arquivos maiores que a data de corte Go(objFolder) 'Finaliza Criação do script FTP objTextFile.WriteLine("quit") objTextFile.close objshell.run ("%ComSpec% /k ftp -s:" & strFTPScript & " " & strFTPDestino) ' -- Funções Sub Go(objDIR) If objDIR <> "\System Volume Information" Then For Each eFolder in objDIR.SubFolders Go eFolder Next For Each strFiles In objDIR.Files strFileName = strFiles.Name strFilePath = strFiles.Path 'Na próxima linha compara a data If strFiles.DateLastModified >= strDataCorte Then 'Aqui ele escreve o put dentro do arquivo de scritp FTP objTextFile.WriteLine("put " & strFiles.path) End If Next End If End Sub
A janela não vai fechar mais.
Se quiser que feche altere a linha abaixo:
objshell.run ("%ComSpec% /k ftp -s:" & strFTPScript & " " & strFTPDestino)
para
objshell.run ("%ComSpec% /c ftp -s:" & strFTPScript & " " & strFTPDestino)
Só mudar /k para /c
Fábio de Paula Junior
- Sugerido como Resposta Fábio JrModerator terça-feira, 23 de outubro de 2012 14:29
- Marcado como Resposta Thiago_Baptista terça-feira, 23 de outubro de 2012 17:01
-
Boa tarde Fábio,
Agora o Script funcionou. Só tive que realizar algumas alterações na parte de verificação da data, pois desta forma ele não estava reconhecendo a data de modificação do arquivo e incluí uma variável para contar a quantidade de arquivos transferidos. Tive que alterar também a forma de me conectar ao diretório pois, no meu caso, o ftp não está aceitando a conexão direta na pasta que eu quero. Irei verificar no servidor depois. Depois desta alteração, ficou da seguinte forma:
strFolder = "c:\temp" 'A pasta onde estão os arquivos para enviar strFTPUser = "teste" 'Usuário do FTP strFTPSenha="abc123" 'Senha do FTP strFTPScript="C:\Temp\COMANDOS_FTP.txt" 'Arquivo com os comandos FTP, ele será criado strFTPDestino="ftp.meudominio.com.br/teste" 'Destino dos arquivos strFTPDiretorio="/diretorio_desejado" 'Diretório FTP
strcont = 0 'Contador de arquivos a serem transferidos strDataCorte = 0 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("WScript.Shell") ''# Directory to scan Set objFolder = objFSO.GetFolder(strFolder) 'Inicia a criação do arquivo de script Set objTextFile = objFSO.OpenTextFile(strFTPScript, 2, True)'2=ForWriting objTextFile.WriteLine(strFTPUser) objTextFile.WriteLine(strFTPSenha)'Exibe a quantidade de arquivos transferidos, caso strcont > 0
if strcont > 0 then
WScript.echo strcont & " arquivos estão na fila para transferência!"
'Mostra que não existe nenhum arquivo modificado
else
WScript.echo "Nenhum arquivo foi enviado pra fila de transferência"
END IF 'Aqui ele vai entrar e verificar quais são os arquivos maiores que a data de corte Go(objFolder) 'Finaliza Criação do script FTP objTextFile.WriteLine("quit") objTextFile.close objshell.run ("ftp -s:" & strFTPScript & " " & strFTPDestino) ' -- Funções Sub Go(objDIR) If objDIR <> "\System Volume Information" Then For Each eFolder in objDIR.SubFolders Go eFolder Next For Each strFiles In objDIR.Files strFileName = strFiles.Name strFilePath = strFiles.Path 'Na próxima linha compara a data If (dateDiff("d",strFiles.DateLastModified,now) <= strDataCorte) Then 'Aqui ele escreve o put dentro do arquivo de scritp FTP objTextFile.WriteLine("put " & strFiles.path)strcont = strcont + 1 End If Next End If End Sub
Está funcionado perfeitamente agora! Só mais uma dúvida: tem como colocar o prompt em que o comando ftp é executado para executar como oculto?
Muito obrigado a todos pela ajuda!!!
Vlw!- Marcado como Resposta Thiago_Baptista terça-feira, 23 de outubro de 2012 16:59
Todas as Respostas
-
Thiago,
Com .BAT deve resolver.
Digamos que vc tenha uma pasta com 10 arquivos e somente 3 são do dia que vc quer enviar, então utilize o FORFILES, ele tem a opção /D para filtrar data, o FORFILES lê cada arquivo e pode executar um comando com o nome do arquivo que ele pegou, no parametro de comando vc vai enviar arquivo por arquivo.
Tente fazer , se não conseguir coloque aqui o script que você tentou.
Fábio de Paula Junior
-
Tenta isso, dentro do powershell
$File = .\Desktop\eutenho.txt $File = ".\Desktop\eutenho.txt" $ftp = "ftp://USUARIO:SENHA@ENDEREÇOFTP/wwwroot/eu.txt" $webclient = New-Object System.Net.WebClient $uri = New-Object System.Uri($ftp) $webclient.UploadFile($uri, $File)
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki -
Bom dia Fábio!
Como eu preciso que a data seja a atual, fiz o seguinte script, utilizando .vbs, pois não sei se tem como utilizar variáveis em .bat:
et objShell = WScript.CreateObject( "WScript.Shell" )
strdata = "date /T"
strpath = "C:\TESTE"
objshell.run ("forfiles /P",strpath,"/D",strdata,"/C 'ftp -s:C:\BACKUP_SCRIPTS\COMANDOS_FTP.txt ftp.meudominio.com.br/teste'")O Script executa sem erro, porém ele abre o prompt de comando e facha logo em seguida, sem que os arquivos sejam copiados.
Um outro problema é que preciso que este script rode em um PC com WINDOWS XP, que não possui o FORFILES. Existe alguma outra alternativa para criar este SCRIPT?
Obrigado!
-
Bom dia Matheus!
Este script está acusando erros durante a execução:
$File = "D:\TESTE55\*.xml"
$ftp = "ftp://usuario:senha@meudominio.com.br/teste/"
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
$webclient.UploadFile($uri, $File)
New-Object : Exceção ao chamar ".ctor" com "1" argumento(s): "URI inválido: o nome do host não pôde ser analisado."
Em linha:4 caractere:18
+ $uri = New-Object <<<< System.Uri($ftp)
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
Exceção ao chamar "UploadFile" com "2" argumento(s): "Valor não pode ser nulo.
Nome do parâmetro: address"
Em linha:5 caractere:22
+ $webclient.UploadFile <<<< ($uri, $File)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodExceptionTeria como fazer o script para realizar esta tarefa em .vbs?
Obrigado pela ajuda!
-
trocou os dados do dominio na variavel $ftp?
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki -
-
o $file não pode usar o *.xml, vai ter que ser o nome do arquivo ou você pode trocar o codigo
Foreach($File in (Get-ChildItem "D:\TESTE55\*.xml")){ $ftp = "ftp://usuario:senha@meudominio.com.br/teste/" $webclient = New-Object System.Net.WebClient $uri = New-Object System.Uri($ftp) $webclient.UploadFile($uri, $File.Fullname) }
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki- Marcado como Resposta Thiago_Baptista terça-feira, 23 de outubro de 2012 17:01
-
Thiago,
Olha este .VBS, o que ele faz é gerar o script FTP, ele escreve os comandos para cada arquivo.
Não se esqueça de configurar as váriaveis que estão logo no inicio.
Obs.: Não testei o script.
strFolder = "c:\temp" 'A pasta onde estão os arquivos para enviar strFTPUser = "teste" 'Usuário do FTP strFTPSenha="abc123" 'Senha do FTP strFTPScript="C:\Temp\COMANDOS_FTP.txt" 'Arquivo com os comandos FTP, ele será criado strFTPDestino="ftp.meudominio.com.br/teste" 'Destino dos arquivos strDataCorte = date() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("WScript.Shell") ''# Directory to scan Set objFolder = objFSO.GetFolder(strFolder) 'Inicia a criação do arquivo de script Set objTextFile = objFSO.OpenTextFile(strFTPScript, 2, True)'2=ForWriting objTextFile.WriteLine("user " & strFTPUser ) objTextFile.WriteLine(strFTPSenha) 'Aqui ele vai entrar e verificar quais são os arquivos maiores que a data de corte Go(objFolder) 'Finaliza Criação do script FTP objTextFile.WriteLine("quit") objTextFile.close objshell.run ("ftp -s:" & strFTPScript & " " & strFTPDestino) ' -- Funções Sub Go(objDIR) If objDIR <> "\System Volume Information" Then For Each eFolder in objDIR.SubFolders Go eFolder Next For Each strFiles In objDIR.Files strFileName = strFiles.Name strFilePath = strFiles.Path 'Na próxima linha compara a data If strFiles.DateLastModified >= strDataCorte Then 'Aqui ele escreve o put dentro do arquivo de scritp FTP objTextFile.WriteLine("put " & strFiles.path) End If Next End If End Sub
Ref.:
http://www.howtogeek.com/howto/windows/how-to-automate-ftp-uploads-from-the-windows-command-line/
Fábio de Paula Junior
-
Boa tarde Fábio,
Realizei os testes, substituindo apenas os dados da minha conexão, e o script não funciona corretamente. Ele abre o prompt de comando e fecha rapidamente. Dá erro de sintaxe no comando ftp...
Tem alguma forma de realizar uma "pausa" para poder visualizar o erro?
Obrigado!
-
Amigo, testou esse código?
Foreach($File in (Get-ChildItem "D:\TESTE55\*.xml")){ $ftp = "ftp://usuario:senha@meudominio.com.br/teste/" $webclient = New-Object System.Net.WebClient $uri = New-Object System.Uri($ftp) $webclient.UploadFile($uri, $File.Fullname) }
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki -
Thiago,
Eu vou tentar ver isso, mas por enquanto faça outro teste.
O arquivo .txt que o script gera. Se vc usar ele no prompt de comando com o comando FTP (ftp -s:script.txt endereço_ftp), ele funciona? manda os arquivos?
é bom vc testar o PowerShell que o Matheus enviou também, é bem mais simples.
Fábio de Paula Junior
- Editado Fábio JrModerator segunda-feira, 22 de outubro de 2012 20:30 faça
-
um teste que você pode fazer é abrir o Explorer, e digitar na barra de endereço de pastas ftp://servidorftp.com.br
ele vai pedir usuario e senha, autentique e tenta copiar na mão os arquivos.
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki -
Fiz uma modificação que fica fácil ver o que está sendo feito.
Fiz algumas alterações, coloque seus dados novamente e tente.
strFolder = "c:\temp" 'A pasta onde estão os arquivos para enviar strFTPUser = "teste" 'Usuário do FTP strFTPSenha="abc123" 'Senha do FTP strFTPScript="C:\Temp\COMANDOS_FTP.txt" 'Arquivo com os comandos FTP, ele será criado strFTPDestino="ftp.meudominio.com.br/teste" 'Destino dos arquivos strDataCorte = date() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("WScript.Shell") ''# Directory to scan Set objFolder = objFSO.GetFolder(strFolder) 'Inicia a criação do arquivo de script Set objTextFile = objFSO.OpenTextFile(strFTPScript, 2, True)'2=ForWriting objTextFile.WriteLine(strFTPUser) objTextFile.WriteLine(strFTPSenha) 'Aqui ele vai entrar e verificar quais são os arquivos maiores que a data de corte Go(objFolder) 'Finaliza Criação do script FTP objTextFile.WriteLine("quit") objTextFile.close objshell.run ("%ComSpec% /k ftp -s:" & strFTPScript & " " & strFTPDestino) ' -- Funções Sub Go(objDIR) If objDIR <> "\System Volume Information" Then For Each eFolder in objDIR.SubFolders Go eFolder Next For Each strFiles In objDIR.Files strFileName = strFiles.Name strFilePath = strFiles.Path 'Na próxima linha compara a data If strFiles.DateLastModified >= strDataCorte Then 'Aqui ele escreve o put dentro do arquivo de scritp FTP objTextFile.WriteLine("put " & strFiles.path) End If Next End If End Sub
A janela não vai fechar mais.
Se quiser que feche altere a linha abaixo:
objshell.run ("%ComSpec% /k ftp -s:" & strFTPScript & " " & strFTPDestino)
para
objshell.run ("%ComSpec% /c ftp -s:" & strFTPScript & " " & strFTPDestino)
Só mudar /k para /c
Fábio de Paula Junior
- Sugerido como Resposta Fábio JrModerator terça-feira, 23 de outubro de 2012 14:29
- Marcado como Resposta Thiago_Baptista terça-feira, 23 de outubro de 2012 17:01
-
Boa tarde Matheus,
Testei sim, e funcionou. Um fato que me impede de poder utilizar o PowerShell é que o script terá que ser executado em uma máquina com WINDOWS XP. Mas, de qualquer forma, testei este SCRIPT no PowerShell da minha máquina com WINDOWS 7 e funcionou.
Valeu mesmo pela ajuda!
-
Talvez seja contra mão... mas voce pode instalar o powershell no xp
http://www.microsoft.com/pt-br/download/details.aspx?id=9591
Ajudei? Marca como útil.
Visite meu blog: HowToServer
Quer conversar sobre Powershell?
entre nos grupos, no Facebook e noLinkedin Cadastre-se também na mailing list Powershell Brasil Quer Aprender Powershell?
Meus Artigos na TechNet Wiki -
Boa tarde Fábio,
Agora o Script funcionou. Só tive que realizar algumas alterações na parte de verificação da data, pois desta forma ele não estava reconhecendo a data de modificação do arquivo e incluí uma variável para contar a quantidade de arquivos transferidos. Tive que alterar também a forma de me conectar ao diretório pois, no meu caso, o ftp não está aceitando a conexão direta na pasta que eu quero. Irei verificar no servidor depois. Depois desta alteração, ficou da seguinte forma:
strFolder = "c:\temp" 'A pasta onde estão os arquivos para enviar strFTPUser = "teste" 'Usuário do FTP strFTPSenha="abc123" 'Senha do FTP strFTPScript="C:\Temp\COMANDOS_FTP.txt" 'Arquivo com os comandos FTP, ele será criado strFTPDestino="ftp.meudominio.com.br/teste" 'Destino dos arquivos strFTPDiretorio="/diretorio_desejado" 'Diretório FTP
strcont = 0 'Contador de arquivos a serem transferidos strDataCorte = 0 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("WScript.Shell") ''# Directory to scan Set objFolder = objFSO.GetFolder(strFolder) 'Inicia a criação do arquivo de script Set objTextFile = objFSO.OpenTextFile(strFTPScript, 2, True)'2=ForWriting objTextFile.WriteLine(strFTPUser) objTextFile.WriteLine(strFTPSenha)'Exibe a quantidade de arquivos transferidos, caso strcont > 0
if strcont > 0 then
WScript.echo strcont & " arquivos estão na fila para transferência!"
'Mostra que não existe nenhum arquivo modificado
else
WScript.echo "Nenhum arquivo foi enviado pra fila de transferência"
END IF 'Aqui ele vai entrar e verificar quais são os arquivos maiores que a data de corte Go(objFolder) 'Finaliza Criação do script FTP objTextFile.WriteLine("quit") objTextFile.close objshell.run ("ftp -s:" & strFTPScript & " " & strFTPDestino) ' -- Funções Sub Go(objDIR) If objDIR <> "\System Volume Information" Then For Each eFolder in objDIR.SubFolders Go eFolder Next For Each strFiles In objDIR.Files strFileName = strFiles.Name strFilePath = strFiles.Path 'Na próxima linha compara a data If (dateDiff("d",strFiles.DateLastModified,now) <= strDataCorte) Then 'Aqui ele escreve o put dentro do arquivo de scritp FTP objTextFile.WriteLine("put " & strFiles.path)strcont = strcont + 1 End If Next End If End Sub
Está funcionado perfeitamente agora! Só mais uma dúvida: tem como colocar o prompt em que o comando ftp é executado para executar como oculto?
Muito obrigado a todos pela ajuda!!!
Vlw!- Marcado como Resposta Thiago_Baptista terça-feira, 23 de outubro de 2012 16:59
-
Altere esta linha:
objshell.run ("ftp -s:" & strFTPScript & " " & strFTPDestino, 0)
Adicionei uma parametro com valor 0. Este parametro não é obrigatório por isso funcionava sem ele, os possiveis valores são:
0
Hide
the window and activate another window.
Ref.:
1 Activate and display the window. (restore size and position) Specify this flag when displaying a window for the first time.
2 Activate & minimize.
3 Activate & maximize.
4 Restore. The active window remains active.
5 Activate & Restore.
6 Minimize & activate the next top-level window in the Z order.
7 Minimize. The active window remains active.
8 Display the window in its current state. The active window remains active.
9 Restore & Activate. Specify this flag when restoring a minimized window.
10 Sets the show-state based on the state of the program that started the application.
.Run
ss64.com/vb/run.html
Fábio de Paula Junior
- Editado Fábio JrModerator terça-feira, 23 de outubro de 2012 14:44 add link
-
-
-
Thiago,
Um livro que já utilizei era um manual acho que da editora Novatec, é um livro fininho que você acha até pra baixar na internet, de graça.
Mas o melhor mesmo é o script center da Microsoft, tem vários exemplos de scripts, no inicio vc faz vários "franksteins" juntando os scripts mas depois que vc entende melhor e faz scripts mais refinados.
Script center
http://technet.microsoft.com/pt-br/scriptcenter/bb410849.aspx
.
Ebooks Novatec
Fábio de Paula Junior
-
Pow, valeu mesmo pela ajuda Fábio.
Já deu uma olhada no livro e no Script Center. Irão ajudar demais na interpretação das funções de grande parte dos objetos que podem ser utilizados. A minha grande dificuldade no momento é essa, quais objetos podem ser utilizados e quais as funções de cada um deles.
Obrigado!