Страница 1 из 1

прошу помощи по tprocess (перенаправление вывода) РЕШЕНО

СообщениеДобавлено: 05.01.2015 20:27:51
Deimos
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var proc1:tprocess;
begin
   proc1:=tprocess.Create(selfl);
   proc1.Options:=proc1.Options+[powaitonexit, poUsePipes];
   proc1.CommandLine:=extractfilepath(paramstr(0))+'mysqldump.exe -uuser -ppassword dbname > dbname.sql';
   proc1.Execute;
   proc1.Free;
end;


не работает конструкция.

P.S. С двойными кавычками тоже не работает.

Re: прошу помощи по tprocess

СообщениеДобавлено: 05.01.2015 22:19:50
Little_Roo
Deimos писал(а):proc1:=tprocess.Create(selfl);

Ы ?

Re: прошу помощи по tprocess

СообщениеДобавлено: 05.01.2015 22:32:59
Ism
Надо так
http://www.freepascal.ru/forum/viewtopic.php?f=5&t=8151
Код: Выделить всё
Process1.Active:=false;
Process1.ShowWindow:=swoShow;
Process1.Executable:='cmd';
Process1.Parameters.Clear;
Process1.Parameters.Add('/k');
Process1.Parameters.Add('notepad.exe');
Process1.Execute;

Re: прошу помощи по tprocess

СообщениеДобавлено: 06.01.2015 06:02:49
Deimos
Little_Roo писал(а):Ы ?

Ачепятка - эту ошибку я сам-бы нашел :)

Ism писал(а):Надо так

В обоих случаях (первоначальный/рекомендованный) результат абсолютно одинаков.

Консоль вывода:

-- MySQL dump 10.14 Distrib 5.5.36-MariaDB, for Win64 (x86)
--
-- Host: localhost Database: dbtest > dbtest.sql
-- ------------------------------------------------------
-- Server version 5.5.36-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Re: прошу помощи по tprocess

СообщениеДобавлено: 06.01.2015 06:56:13
скалогрыз
мне кажется у тебя лишний "> dbname.sql"
дело в том, что символ перенаправления вывода ">" есть надстройка оболочки (будь то cmd или какой-нибудь никсовый shell).
используя TProcess перенаравление вывода в файл dbname.sql нужно реализовывать самостоятельно, и "> dbname.sql" из параметров убирать

вызов через "cmd" соовершенно не нужен

Добавлено спустя 7 минут 13 секунд:
ну и есть же запасной вариант. не заморачиватся с TProcess и просто передать --result-file=dbname.sql в mysqldump

Re: прошу помощи по tprocess

СообщениеДобавлено: 06.01.2015 07:04:50
sign
Мой вариант. Рабочий
Код: Выделить всё
function TDM.SaveDataBase: Boolean;
var S, SDir: String;
    TDir: WideString;
    prc: String;
    ParamString: String;
    P: TProcess;
begin
  // Сохранить все данные в архиве
  Result := False;
  S := ParamStr(0);  // Путь к программе
  SDir := ExtractFilePath(S);
  TDir := Utf8ToAnsi(NewArchiveName(SDir + CDirArchiveData + '\'));
  if TDir = '' then Exit;
  if not ForceDirectories(TDir) then Exit;
  S := DM.con.DatabaseName;
  ParamString :=  Format(' -uroot -hlocalhost -B %s --result-file="%s%s.sql"', [S, TDir, S]) + #0;
  prc := 'C:\Program Files\MySQL\MySQL Workbench 5.2 CE\mysqldump.exe';
  P := TProcess.Create(nil);
  P.CommandLine := prc + ParamString;
  P.Options := P.Options + [poWaitOnExit, poNoConsole];
  P.Execute;
  Result := P.ExitStatus = 0;
  P.Free;
end;


Re: прошу помощи по tprocess (перенаправление вывода) РЕШЕНО

СообщениеДобавлено: 06.01.2015 07:30:46
Deimos
был сонный и НЕ внимательный = "самдурак"

скалогрыз писал(а):мне кажется у тебя лишний "> dbname.sql"
согласен. нашел сам, до прочтения Вашего поста.

Ism писал(а):Надо так


Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var proc1:tprocess;
begin
   proc1:=tprocess.Create(selfl);
   proc1.Options:=proc1.Options+[powaitonexit, poUsePipes];
   proc1.Executable:='cmd';
   proc1.Parameters.add=extractfilepath(paramstr(0))+'mysqldump.exe -uuser -ppassword dbname > dbname.sql';
   proc1.Execute;
   proc1.Free;
end;


скалогрыз писал(а):вызов через "cmd" соовершенно не нужен

sign писал(а):Мой вариант. Рабочий


Вариант более изящный/удобный - спасибо.

P.S.
скалогрыз писал(а): --result-file=dbname.sql
- не знал = не полностью вник в команды = (опять-же) "самдурак"