[Erledigt] TProcess Parameter funktionieren nicht richtig

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

[Erledigt] TProcess Parameter funktionieren nicht richtig

Beitrag von Michl »

Hallo,
ich bin gerade dabei mich in die Datenbanknutzung einzuarbeiten und habe jetzt ein seltsames Problem mit "TProcess" oder auch "ExectuteProcess".

Um eine Datenbanksicherung durchzuführen, kann man das Programm "mysqldump.exe" ausführen und es wird ein Backup erstellt.

Führe ich also "cmd" aus und schreibe dann "mysqldump.exe --opt Vigema > C:\Vigema03\Vigema.sql -uroot -p*** -hlocalhost" wird mir die Backup-Datei erstellt.

Will ich das ganze in Lazarus ausführen schreibe ich also:

Code: Alles auswählen

  aProc:=TProcess.Create(Nil);
  aProc.Executable:='mysqldump.exe';
  aProc.Parameters.Add('--opt');
  aProc.Parameters.Add('Vigema');
  aProc.Parameters.Add('>');
  aProc.Parameters.Add('C:\Vigema03\Vigema.sql');
  aProc.Parameters.Add('-uroot');
  aProc.Parameters.Add('-p***');
  aProc.Parameters.Add('-hlocalhost');
Führe ich dann aProc aus, kommt es immer zu dem Fehler "Couldn´t find table ">" "(von mysqldump erzeugter Parameterfehler) . Google hilft mir da leider nicht weiter! Alle Parameter in ein ".Parameters.Add" hinein funktioniert ebenfalls nicht.

Übergebe ich statt dessen

Code: Alles auswählen

  aProc.Parameters.Add('--help');
wird ganz normal die Hilfe angezeigt. Die Parameterübergabe funktioniert da also!

Der gleiche Fehler tritt bei

Code: Alles auswählen

  ExecuteProcess('mysqldump.exe',' --opt Vigema > C:\Vigema03\Vigema.sql -uroot -p*** -hlocalhost',[]);
auf!

Ich habe mir jetzt damit geholfen, dass ich die Kommandozeile "mysqldump.exe --opt Vigema > C:\Vigema03\Vigema.sql -uroot -p*** -hlocalhost" in eine "speichern.bat" geschrieben habe und diese mittels aProc.execute aufrufe. Das funktioniert!

Ich habe gefühlte 100mal meine Rechtschreibung überprüft, mit und ohne Apostrophe probiert, keine Änderung! Kann mir jemand dieses Verhalten erklären bzw. mir sagen was ich falsch mache oder ich anders machen muss?!

Danke
Zuletzt geändert von Michl am Mi 10. Jul 2013, 15:06, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6828
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TProcess Parameter funktionieren nicht richtig

Beitrag von af0815 »

nehme statt der mysqldump.exe eine batchdatei und lass dir anzeigen was wirklich daher kommt. Anzunehmen das es Probleme beiom Escapen gibt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10899
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess Parameter funktionieren nicht richtig

Beitrag von theo »


Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess Parameter funktionieren nicht richtig

Beitrag von Michl »

af0815 hat geschrieben:nehme statt der mysqldump.exe eine batchdatei und lass dir anzeigen was wirklich daher kommt. Anzunehmen das es Probleme beiom Escapen gibt.
Aber das habe ich doch -> siehe oben (...Ich habe mir jetzt damit geholfen, dass ich die Kommandozeile "mysqldump.exe --opt Vigema > C:\Vigema03\Vigema.sql -uroot -p*** -hlocalhost" in eine "speichern.bat" geschrieben habe...), dann funktioniert es doch auch

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess Parameter funktionieren nicht richtig

Beitrag von Michl »

theo hat geschrieben:TProcess ist keine Shell!

http://wiki.lazarus.freepascal.org/Exec ... .3C_.3E.22
Danke, das habe ich verdrängt. Doch wenn ich das jetzt richtig gelesen habe, hätte

Code: Alles auswählen

 aProc.CommandLine:='mysqldump.exe --opt Vigema > C:\Vigema03\Vigema.sql -uroot -p*** -hlocalhost';
funktionieren können bzw. müssen?

Leider hat das keinen Erfolg -> der gleiche Fehler in der Ausgabe in der Konsole! :(

Bedeutet also, dass das gar nicht geht, nur wenn ich das mit der Batchdatei "Speichern.bat" mache???

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10899
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess Parameter funktionieren nicht richtig

Beitrag von theo »

Dann hast du das nicht gelesen.

">" ist ein Shell Kommando zur Umleitung der Outputs.

Steht doch im Link, dass es nicht geht.
ShellExecute('dir > output.txt');
Executing this with TProcess will not work. i.e:
Es stehen dort auch Varianten, wie es geht.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TProcess Parameter funktionieren nicht richtig

Beitrag von Michl »

theo hat geschrieben:Dann hast du das nicht gelesen.

">" ist ein Shell Kommando zur Umleitung der Outputs.

Steht doch im Link, dass es nicht geht.
ShellExecute('dir > output.txt');
Executing this with TProcess will not work. i.e:
Es stehen dort auch Varianten, wie es geht.
:oops: Habe ich glatt übersehen, obwohl dein Link mich direkt dahingeführt hat!

Werd nun mal mein Bestes geben, danke fürs Anschubsen!

[Edit] Hmm, ist mir zu hoch. Ich habe versucht als einfaches Beispiel, den Ausdruck "dir > dateien.txt" entsprechend Bsp. von Theo bzw. auf deutsch http://wiki.freepascal.org/Executing_Ex ... Process_um umzusetzen.

Ich scheitere daran, das ">" zu interpretieren.

Da das mir generell nach zu viel Aufwand aussieht, werde ich das jetzt nicht weiter verfolgen. Einfacher wäre es da für mich, mir während der Laufzeit eine Batchdatei zu erstellen und diese dann aufzurufen.

Nicht desto trotz habe ich jetzt noch eine Lösung für mein Problem gefunden. Funktioniert evtl. aber nur unter Windows?! Ich rufe "cmd" auf und übergebe diesem einfach den Befehl und schon läuft es, wie gewollt:

Code: Alles auswählen

procedure TForm1.BDatenbankSpeichernClick(Sender: TObject);      //Speichert die aktuelle Datenbank
var
  aProc:TProcess;
  Dateiname,PS:string;
begin
  Dateiname:= TempPfad + FormatDateTime('yy-mm-dd',now) + '-vigema.sql';  
 
  aProc:=TProcess.Create(Nil);
  aProc.Executable:='cmd';                  //Weiss nicht, ob "cmd" nur bei Windows geht???
                                            //jetzt Parameterstring zusammenbauen
  PS:='/C';                                 //Parameter, damit cmd nachfolgenden Text ausführen soll
  PS:=PS+' "'+SQLPfad+'mysqldump.exe"';     //In Hochklammern, da sonst Leerzeichen als einzelne Parameter gelesen werden
                                            //gibt sonst Fehler, da in C:\Program Files\... ein Leerzeichen ist!!!
                                            //SQLPfad zuvor mit SQL-Befehl "select @@basedir;" ausgelesen und als Global gespeichert
  PS:=PS+' --opt Vigema > '+Dateiname+' -uroot -p*** -hlocalhost';
 
  aProc.Parameters.Add(PS);
//  aProc.StartupOptions:=aProc.StartupOptions+[suoUseShowWindow];
  aProc.ShowWindow:=swoHIDE;                //Verdecktes Öffnen von "cmd"
  try
    aProc.Execute;
    if status.MaxVisible>1 then status.Write(1,'[TForm1.BDatenbankSpeichernClick] Datenbank [Vigema] erfolgreich in ['+Dateiname+'] gespeichert!');
  except
    on e:Exception do begin
      status.Write(1,'[TForm1.BDatenbankSpeichernClick] Fehler: '+e.Message);
    end;
  end;
  aProc.Free;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten