Como executar comando do DOS no Delphi?
07/03/2017
0
Faz dias que estou tentando finalizar um utilitário para backup. Uso um arquivo .BAT para auxiliar e ele contém a seguinte linha...
ex.:
".\\Rar.exe" u -as -ep1 -m5 ".\\Backup 07-03-2017-17-44-13.rar" ".\\Config.ini" ".\\*.mrf"
Uso o console Rar.exe do WinRAR para a compactação. Porém gostaria que essa linha fosse executada de dentro do próprio utilitário, sem necessidade do .BAT. É possível?
Já tentei de todas as formas usar o WinExec com vários exemplos que vi na NET mas nenhum funcionou. Não apresenta erro mas não executa nunca o comando.
Inclusive tentei implementar algo que tem tudo que eu preciso neste artigo Artigo Clube Delphi 102 - Services Applications Mas também não funcionou.
Desde já agradeço pela atenção!
Luziraldo Godinho
Post mais votado
07/03/2017
Como criar arquivo BAT, aguardar que ele seja executado e depois excluir ele.
Função que Executa um comando e aguarda que ele seja finalizado...
function TFrmCadastro.WinExecAndWait32(FileName: String; WorkDir: String; Visibility: integer): integer; var zAppName: array[0..512] of char; zCurDir: array[0..255] of char; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin StrPCopy(zAppName,FileName); StrPCopy(zCurDir,WorkDir); FillChar(StartupInfo,Sizeof(StartupInfo),#0); StartupInfo.cb:=Sizeof(StartupInfo); StartupInfo.dwFlags:=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow:=Visibility; if not CreateProcess(nil,zAppName,nil,nil,False,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,zCurDir,StartupInfo,ProcessInfo) then Result:=-1 else begin WaitforSingleObject(ProcessInfo.hProcess,INFINITE); GetExitCodeProcess(ProcessInfo.hProcess,DWORD(Result)); end; end;
Função que executa um comando no CMD... e depois deleta o arquivo após executá-lo
function TFrmCadastro.AddDeleteServico(comando: string): boolean; var txt: TextFile; dir: string; ret: boolean; begin ret:=False; try dir:=ExtractFilePath(Application.ExeName); AssignFile(txt, dir + 'User.bat'); Rewrite(txt); Write(txt,comando); CloseFile(txt); if WinExecAndWait32(dir + 'User.bat',dir,SW_ShowNormal) = 0 then ret:=True; DeleteFile(dir + 'User.bat'); finally AddDeleteServico:=ret; end; end;
Para usar basta que você faça por exemplo:
procedure ExecComando; var comando : string; begin comando := 'C:\\Arquivos de programas\\MySQL\\MySQL Server 5.0\\bin\\mysqldump --xml --host=localhost --user=root --password=root mateus > c:\\ccc.xml'; AddDeleteServico(Comando); end;
Obrigado a todos pela atenção.
Luziraldo Godinho
Mais Posts
07/03/2017
Luziraldo Godinho
Tentei com Shellexecute, não funcionou.
ShellExecute(handle,'open','".\\Rar.exe" u -as -ep1 -m5 ".\\Backup\\PADRAO\\Backup_P 07-03-2017-17-44-13.rar" ".\\Config.ini" ".\\*.mrf"', '','',SW_SHOWNORMAL);
Preciso que ele execute a seguinte linha:
".\\Rar.exe" u -as -ep1 -m5 ".\\Backup\\PADRAO\\Backup_P 07-03-2017-17-44-13.rar" ".\\Config.ini" ".\\*.mrf"
Obrigado!
07/03/2017
Luziraldo Godinho
Vi na NET que WinExec e Shellexecute não funciona em 64 bits
07/03/2017
Luziraldo Godinho
Assim funcionou:
procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(Self.Handle,'open',PChar('.\\RAR.bat'),nil,nil,SW_SHOWNORMAL); end; end.
Mas preciso passar para o .bat, o comando
".\\\\Rar.exe" u -as -ep1 -m5 ".\\\\Backup\\\\PADRAO\\\\Backup_P 07-03-2017-17-44-13.rar" ".\\\\Config.ini" ".\\\\*.mrf"
07/03/2017
Raimundo Pereira
Estou usando o Xe7 W7 64
07/03/2017
Luziraldo Godinho
Clique aqui para fazer login e interagir na Comunidade :)