Inquiridor
VBA não executa .bat com permissão de acesso ao FTP (Windows 7 x64)

Pergunta
-
Caros,
Estou com um grande problema ao automatizar alguns processos de relatórios.
Quando executo um batch ele procede normalmente até o fim, mas ao executar em uma macro (VBA) do Access ele trava e não continua a execução.
Consigo executar normalmente de outras máquinas, mas a minha em específico é Windows 7 x64 e não executa, as demais são x86.
Ao dar dois cliques no batch ele executa normalmente. Aparentemente é um problema relacionado ao acesso da execução via shell (processo chamado).
Ele para a execução na linha 5: "mget EXTRACOES/REGIONALA/arquivoA_08062016*"
Shell:
Shell ("C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\files_config\arquivoD1.bat"), vbNormalFocus
__________________________________________________________________________
Linha de comando:
ftp -s:"C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\files_config\arquivoD1.txt" 0.00.0.000
__________________________________________________________________________
Arquivo txt a ser executado:
dominio/meuUsuario
M1nhaS3nha
lcd "C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\ftp_files_lists"
prompt off
mget EXTRACOES/REGIONALA/arquivoA_08062016*
mget EXTRACOES/REGIONALB/arquivoA_08062016*
mget EXTRACOES/REGIONALC/arquivoA_08062016*
mget EXTRACOES/REGIONALD/arquivoA_08062016*
mget EXTRACOES/REGIONALE/arquivoA_08062016*
mget EXTRACOES/REGIONALF/arquivoA_08062016*
mget EXTRACOES/REGIONALG/arquivoA_08062016*
mget EXTRACOES/REGIONALA/arquivoB_08062016*
mget EXTRACOES/REGIONALB/arquivoB_08062016*
mget EXTRACOES/REGIONALC/arquivoB_08062016*
mget EXTRACOES/REGIONALD/arquivoB_08062016*
mget EXTRACOES/REGIONALE/arquivoB_08062016*
mget EXTRACOES/REGIONALF/arquivoB_08062016*
mget EXTRACOES/REGIONALG/arquivoB_08062016*
quit
___________________________________________________________________________
Alguém tem alguma solução prática para isso? Ou algo que possa fazer para verificar as permissões de acessos e corrigir o problema?
- Editado Alex A Bueno sexta-feira, 10 de junho de 2016 11:06
Todas as Respostas
-
-
-
Infelizmente ao rodar um bat você não consegue capturar a descrição do erro, você consegue detectar somente se aconteceu um erro e fazer um genérico tratamento.
Veja as referências abaixo:
- http://stackoverflow.com/questions/31445330/does-windows-batch-support-exception-handling
- http://www.codeproject.com/Questions/779412/How-to-use-try-catch-blocks-in-cmd-or-batch-files
Sugestão
Isolar o problema
Monte uma aplicação console em VB.NET para simular o comando "mget" considerando o bloco tray catch para a captura da exceção.
Uma vez que o tratamento com bat dificulta o tratamento de exceção, considero importante um esforço para migrar a solução de *.bat para um console application (C# ou VB) - ressaltando que a versão express do visual studio é gratuita e possibilita a criação desse tipo de solução. Com ela você poderá de maneira simplificada tratar erros com log e alertas por e-mail com a coleta da descrição do erro como o próprio stack trace, mensagem, etc.
-
Bom, não sei ao certo o que pode estar causando isso. O que sei é que a instrução Shell funciona normalmente no Office 32 e 64 bits.
Algumas hipóteses:
1 - O caminho "C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\ftp_files_lists" não existe na sua máquina.
2 - Existe o caminho "C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\ftp_files_lists", mas não existe as subpastas "EXTRACOES/REGIONALA" dentro dele.
3 - Estou estranhando usar / ao invés de \. Já experimentou trocar e deixar tudo \ nas separações?
4 - O arquivo executável MGET não funciona em plataformas 64 bits do Windows.
http://www.ambienteoffice.com.br - http://www.clarian.com.br
-
-
Felipe,
Desde já agradeço a atenção.
O bat funciona normalmente quando eu executo, simplesmente clicando duas vezes no arquivo, bem normal, porém quando eu executo via o comando Shell do vba ele não roda, nem mesmo quando deixo ele no Scheduler, ele trava no MGET até que expire o tempo.
Dá-se um problema que acredito ser devido a permissão de acesso a execução ou algum permissionamento de meu usuário, porém nos sistemas x86 ele executa normalmente, descartando o permissionamento do meu usuário.
Gostaria de resolver o problema tendo em vista que pode ter mais usuários com o mesmo problema, para mim seria também de grande ajuda.
-
Gilberto,
Concordo que devo alterar os métodos da aplicação, assim que possível vou migrar para outro método.
O que acho muito estranho é que a aplicação não apresenta erro executando pelo clique, mas sim somente pelo Shell.
Obrigado pela atenção.
-
Uma última sugestão: tente acessar a chamar Shell usando uma API do Windows:
Option Explicit Private Const SW_SHOWMAXIMIZED = 3 #If VBA7 Then Private Declare PtrSafe Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As LongPtr, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As LongPtr) As LongPtr #Else Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long #End If Sub Main() ShellExecute hwnd:=Application.hwnd, _ lpOperation:="open", _ lpFile:="C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\files_config\arquivoD1.bat", _ lpParameters:=vbNullString, _ lpDirectory:=Environ("SystemDrive"), _ nShowCmd:=SW_SHOWMAXIMIZED End Sub
http://www.ambienteoffice.com.br - http://www.clarian.com.br
-
Felipe,
Tentei executar essa solução, porém não executou o código.
Ele exibe a seguinte mensagem de erro:
"Erro de compilação: Método ou membro de dados não encontrado"
Preciso habilitar no VBA alguma biblioteca/ referencia específica?
Obrigado.
-
-
No código fica sublinhado o ".hwnd" e descrimina o erro informado.
Sub main()
ShellExecute hwnd:=Application.hwnd, _
lpOperation:="open", _
lpFile:="C:\Users\meuUsuario\Documents\pastaDeRelatorio\Extrator FTP\files_config\arquivoD1.bat", _
lpParameters:=vbNullString, _
lpDirectory:=Environ("SystemDrive"), _
nShowCmd:=SW_SHOWMAXIMIZED
End Sub -
-
-
-
-