befehle an eine Konsole

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

befehle an eine Konsole

Beitrag von Bauer321 »

ist es möglich das ich mit einer Lazarus anwendung(gui) eine konsole steuern kann?
also ich hab ein bat script und dann öffnet sich ja auch so ne console wenn man echo off macht,
kann ich auch das echo ausschalten und dann mit lazarus die nachrichten auffangen und gegebenfalls auch befehle senden?
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: befehle an eine Konsole

Beitrag von MAC »

ich glaub dafür ist TProcess da (System) ist standartmäßig bei lazarus dabei.

Code: Alles auswählen

Signatur := nil;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Socke »

Bauer321 hat geschrieben:also ich hab ein bat script und dann öffnet sich ja auch so ne console wenn man echo off macht
Das könnte einfach eine unklare Formulierung deinerseits sein, aber die Konsole öffnet sich soweit ich weiß bei jedem Batch-Script. Der Befehl "@echo off" unterbindet lediglich, dass vor jedem Befehl der aktuelle Pfad ausgegeben wird.

Ein Batch-Script kannst du TProcess starten (wie MAC schreibt); du kannst damit aber auch direkt die cmd.exe starten und diese dann noch weitere Befehl ausführen lassen, bevor dein Batch-Script gestartet wird (gib dazu einfach mal "help cmd" in der Konsole ein).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Bauer321 »

hmm ja also ich würde gerne ein programm schrieben welches eine java datei ausführt(diese starte ich momentan via batch)
das programm soll dann die console ausblenden den output in einem tmemo oder ähnlichem ausgeben
außerdem soll man über das programm befehle senden können welche man sonst in der konsole eingibt.

was ich davon habe: ich kann zeitgesteurt(mit nem Timer oder solchen sachen) befehle ausführen lassen.
außerdem kann ich sozusagen ein gui für die konsolenanwendung erstellen was die verwendung ein wenig erleichtert.
ich bräuchte halt mal nen paar denkanstöße und/oder auch beispiele da ich so nicht weiß wie ich das anstellen soll
www.mcpatcher.net | www.hoeper.me

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: befehle an eine Konsole

Beitrag von creed steiger »

http://wiki.lazarus.freepascal.org/Exec ... rograms/de" onclick="window.open(this.href);return false;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Bauer321 »

da habe ich gestern auch schonmal geguckt das hat mir aber nicht wirklich weitergeholfen
www.mcpatcher.net | www.hoeper.me

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Cybermonkey342 »

Ich habe das so bei meiner IDE gelöst

Code: Alles auswählen

begin
    if fileexists(dateiname) then
     begin
       AProcess := TProcess.Create(nil);
       AStringList := TStringList.Create;
       chdir (ExtractFilePath( interpreter));
    AProcess.CommandLine := interpreter +' '+dateiname;
   AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
   AProcess.ShowWindow:=swoHide; //hide the console window
   AProcess.Execute;
   AStringList.LoadFromStream(AProcess.Output);
   output:=AStringList.text;
   AStringList.Free;
   AProcess.Free;
  if output<>'' then
     Memo1.Text:=Memo1.Text+output;
     end;
end;
Muss man dann natürlich anpassen mit Dateiname etc.
Mit besten Grüßen,
Cybermonkey

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Bauer321 »

damit komm ich leider auch nicht wirklich weiter.
also irgendwie muss ich den output ja regelmäßig abrufen.
www.mcpatcher.net | www.hoeper.me

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Bauer321 »

ich habe bisher folgendes aber der output wird nicht richtig abgefangen/aufgefangen

also der process der wird gestartet und auch richtig beendet nur das mit dem ouput geht gar nicht und input auch nciht

http://www7.pic-upload.de/02.04.11/og6lw3jp2mfl.jpg

Code: Alles auswählen

unit umain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, usettings, process;
 
type
 
  { TFMain }
 
  TFMain = class(TForm)
    bstart: TButton;
    bstop: TButton;
    binput: TButton;
    Button3: TButton;
    einput: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    moutput: TMemo;
    Process1: TProcess;
    toutput: TTimer;
    procedure bstartClick(Sender: TObject);
    procedure bstopClick(Sender: TObject);
    procedure binputClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Input(InputEdit:TEdit);
    procedure objects(opt : boolean);
    procedure toutputTimer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  FMain: TFMain;
 
implementation
 
{$R *.lfm}
 
{ TFMain }
 
procedure TFMain.FormDestroy(Sender: TObject);
begin
  if Process1.Running then
     Process1.Terminate(0);
end;
 
procedure TFMain.Button3Click(Sender: TObject);
begin
  FSettings.Visible := not FSettings.Visible;
  if FSettings.Visible = true
     then Button3.caption := 'hide settings'
     else Button3.caption := 'show settings';
end;
 
procedure TFMain.binputClick(Sender: TObject);
begin
  Input(einput);
end;
 
procedure TFMain.bstartClick(Sender: TObject);
var
  AStringlist : TStringlist;
  output : String;
begin
  if not Process1.Running then begin
    objects(true);
    Process1.CommandLine := FSettings.epath.Text;
    Process1.Execute;
    AStringList := TStringList.Create;
    AStringList.LoadFromStream(Process1.Output);
    output:=AStringList.text;
    AStringList.Free;
    if output<>'' then
      moutput.Text:=moutput.Text+output;
    end;
end;
 
procedure TFMain.bstopClick(Sender: TObject);
begin
  if Process1.Running then begin
     Process1.Terminate(0);
     objects(false);
  end;
end;
 
procedure TFMain.Input(InputEdit:TEdit);
var
  command: string;
begin
  if Process1.Running then begin
    command := InputEdit.text;
    Process1.Input.Write(command[1], length(command));
  end;
end;
 
procedure TFMain.objects(opt : boolean);
begin
  bstart.enabled := not opt;
  bstop.enabled := opt;
  moutput.enabled := opt;
  einput.enabled := opt;
  binput.enabled := opt;
  FSettings.epath.enabled := not opt;
  toutput.enabled := opt;
end;
 
procedure TFMain.toutputTimer(Sender: TObject);
var
  AStringlist : TStringlist;
  output : String;
begin
  AStringList := TStringList.Create;
  AStringList.LoadFromStream(Process1.Output);
  output:=AStringList.text;
  AStringList.Free;
  if output<>'' then
      moutput.Text:=moutput.Text+output;
  Application.Processmessages;
end;
 
end.
www.mcpatcher.net | www.hoeper.me

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Cybermonkey342 »

Du hast die TProcess options nicht gesetzt. Siehe hier: http://www.freepascal.org/docs-html/fcl ... tions.html
poUsePipes - Use pipes to redirect standard input and output.
Du willst den Output ja regelmäßig abrufen. Bei meinem Beispiel wird ja auf Ende des Prozesses gewartet. Evtl. musst du einen extra Thread starten; ein Timer reicht unter Umständen nicht.
Mit besten Grüßen,
Cybermonkey

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Bauer321 »

ja dumm von mir die optionen habe ich gestzt in der komponente TProcess habe nur vergessen das zu erwähnen:
diese optionen hab ich da ausgewählt:
Bild

das mit dem thread werde och mir gleich mal ansehen
brauch ich dafür dann multithreading?
www.mcpatcher.net | www.hoeper.me

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: befehle an eine Konsole

Beitrag von Cybermonkey342 »

Bauer321 hat geschrieben: das mit dem thread werde och mir gleich mal ansehen
brauch ich dafür dann multithreading?
Ich fürchte, ja. Vielleicht weiß aber jemand noch eine andere Lösung.
Mit besten Grüßen,
Cybermonkey

Antworten