Como executar comando do DOS no Delphi?

Delphi

Automação Comercial

07/03/2017

Olá, boa tarde.

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

Luziraldo Godinho

Curtidas 0

Melhor post

Luziraldo Godinho

Luziraldo Godinho

07/03/2017

Encontrei a solução final para meu problema e vou deixar o código que encontrei para ajudar quem tiver dúvidas.

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.
GOSTEI 1

Mais Respostas

Raimundo Pereira

Raimundo Pereira

07/03/2017

Use o comando Shellexecute
GOSTEI 0
Luziraldo Godinho

Luziraldo Godinho

07/03/2017

Olá.

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!
GOSTEI 0
Luziraldo Godinho

Luziraldo Godinho

07/03/2017

Esqueci de mencionar que uso Delphi 2010 em Windows 8.1 64 bits.

Vi na NET que WinExec e Shellexecute não funciona em 64 bits
GOSTEI 0
Luziraldo Godinho

Luziraldo Godinho

07/03/2017

Opa.

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"
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

07/03/2017

Pq não cria a bat em run time e executa usando o winexec?
Estou usando o Xe7 W7 64
GOSTEI 0
Luziraldo Godinho

Luziraldo Godinho

07/03/2017

Como eu crio o bat em Runtime?
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

07/03/2017

Pode usar um memo...
GOSTEI 0
Luziraldo Godinho

Luziraldo Godinho

07/03/2017

Ah sim, mas eu nao sei como criar a procedure, pode me ajudar?
GOSTEI 0
POSTAR