codificação do arquivos .bat!

14/06/2021

0

Pessoal estou criando um aplicativo em delphi que restaura um backup em um banco vazio isso em postgres.
Isso através do cmd usando .bat;
assim em um memo eu jogo esse scripts:
---------------------------------------------------------------------------------------------------------------
@echo
cd c:\programfile(x86)\postgres\9.5\bin
psql -U postgres -h localhost banco_vazio < c:\local_do_backup
pause
------------------------------------------------------------------------------------------------------------------
salvo isso como um arquivo .bat
executo;
depois deleto;
O problema é quando eu executo que fica desse jeito
---------------------------------------------------------------------------------------------------------------
@echo
cd c:\programfile(x86)\postgres\9.5\bin
psql -U postgres -h localhost banco_vazio 0< c:\local_do_backup
pause
----------------------------------------------------------------------------------------------------------------
ai ele dá um erro por causa desse zero que aparece do nada!
depois que pesquisei vi que é por causa da codificação do cmd e do bloco de notas que não batem!

Alguem pode me ajudar?
Wanderson Cardoso

Wanderson Cardoso

Responder

Post mais votado

14/06/2021

precisa ser um bat?
você poderia colocar o caminho do postgres e o caminho do banco vazio (e demais dados que forem necessários) num arquivo ini e executar o comando via shell. assim não usa mais o bat.
ou ainda pode criar um script sql para criar o banco de dados (em vez de restaurar de um banco vazio) e executar o script. esse script pode ser gravado 'dentro' do exe a partir de um recurso. também a partir do shell.

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

15/06/2021

Wanderson Cardoso

precisa ser um bat?
você poderia colocar o caminho do postgres e o caminho do banco vazio (e demais dados que forem necessários) num arquivo ini e executar o comando via shell. assim não usa mais o bat.
ou ainda pode criar um script sql para criar o banco de dados (em vez de restaurar de um banco vazio) e executar o script. esse script pode ser gravado 'dentro' do exe a partir de um recurso. também a partir do shell.

Como Faço isso!
Tipo eu seu gravar um arquivo .ini todavia como faço para consultar os parâmetros que tem dentro de um .ini pelo shell!
Aguardando uma resposta!
Desde já agradeço!
Responder

15/06/2021

Emerson Nascimento

supondo que o conteúdo do teu ini seja assim:
[POSTGRES]
path=c:\\programfile(x86)\\postgres\\9.5\\bin
backup=c:\\local_do_backup
server=localhost
emptydatabase=banco_vazio

utilização no Delphi, supondo que o ini tenha o mesmo nome do executável e esteja na mesma pasta...
var
  ArqIni: TIniFile;
  caminhopostgre, caminhobkp, servidor, basevazia: string;
  comando, parametros: string;
begin
  ArqIni := TIniFile.Create(ChangeFileExt(Application.ExeName,'.INI'));
  caminhopostgre := ArqIni.ReadString('POSTGRES','path','');
  caminhobkp := ArqIni.ReadString('POSTGRES','backup','');
  servidor := ArqIni.ReadString('POSTGRES','server','');
  basevazia := ArqIni.ReadString('POSTGRES','emptydatabase','');
  ArqIni.Free;

  if (caminhobkp = EmptyStr) or (servidor = EmptyStr) or (basevazia = emptyStr) then
    ShowMessage('Parâmetros inválidos no arquivo ini')
  else
  begin
    comando := caminhopostgre + 'psql.exe'
    parametros := '-U postgres -h ' + servidor + ' ' + basevazia + ' < ' + caminhobkp;

    // executa e volta para a aplicação
    ShellExecute(handle, 'open', PChar(comando), PChar(parametros), PChar(caminhopostgre), SW_HIDE);

    // executa e aguarda finalizar a execução do comando
    //// declarar SEInfo: TShellExecuteInfo na cláusula var desta função/procedure;
    //// declarar CodigoSaida: DWORD na cláusula var desta função/procedure;
    //FillChar(SEInfo, SizeOf(SEInfo), 0);
    //SEInfo.cbSize := SizeOf(TShellExecuteInfo);
    //with SEInfo do
    //begin
    //  fMask := SEE_MASK_NOCLOSEPROCESS;
    //  Wnd := Application.Handle;
    //  lpFile := PChar(comando) ;
    //  lpParameters := PChar(parametros);
    //  lpDirectory := PChar(caminhopostgre) ;
    //  nShow := SW_HIDE; // ou SW_SHOWNORMAL
    //end;
    //
    //if ShellExecuteEx(@SEInfo) then
    //  repeat
    //    Application.ProcessMessages;
    //    GetExitCodeProcess(SEInfo.hProcess, CodigoSaida) ;
    //  until (CodigoSaida <> STILL_ACTIVE) or Application.Terminated
    //else
    //  ShowMessage('Erro ao restaurar a base de dados!');

  end;

end;

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar