codificação do arquivos .bat!

Banco de Dados

14/06/2021

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

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

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.

GOSTEI 1

Mais Respostas

Wanderson Cardoso

Wanderson Cardoso

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.

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!
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/06/2021

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;

GOSTEI 1
POSTAR