In Lazarus cmd öffen und direkt Befehl ausführen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
JustusiusDE
Beiträge: 3
Registriert: Mi 4. Dez 2019, 19:45

In Lazarus cmd öffen und direkt Befehl ausführen

Beitrag von JustusiusDE »

Hallo Leute,
ich bin noch recht unvertraut mit Lazarus möchte aber schon eine Art Programm schreiben, dass es mir ermöglicht mit der Windows cmd-konsole direkt einen befehl durch einen Knopf auszuführen.
Außerdem soll ein Teil des Commands direkt aus einem TEdit-Bereich stammen.

Um es genauer zu erklären, mein Plan ist folgender: Ich habe vor durch eine Eingabe in z. B. "Edit" eine Domain wie "" und einem darauf folgenden Knopfdruck die cmd öffen und dort direkt den Befehl "nslookup " auszuführen.
Daraufhin soll dann wiederum aus der Ausgabe, welche an dem Beispiel "172.217.22.3" ist, die IP in "Edit2" ausgegeben werden.

Geht das so?
Oder gibt es irgendeinen anderen Weg denselben Effekt zu erzielen?

Ich bedanke mich schon mal für die Hilfe.
LG. Justusius :)

Edit: Ich habe versucht es mit einer .bat - Datei zu schaffen.
Hatte dabei aber leider keinen Erfolg.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 282
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: In Lazarus cmd öffen und direkt Befehl ausführen

Beitrag von h-elsner »

Klar geht das. Das Zauberwort heißt TProcess.
Siehe hier: https://wiki.freepascal.org/Executing_External_Programs

Hier ein Beispiel mit Abfangen der Ausgaben des Kommandos:

Code: Alles auswählen

 
{Call external process and read results from pipe into outlist
 uses Classes, SysUtils, Process}
procedure CallExtProg(cmdln: string; outlist: TStringList); {Call ext process}
var
  cmdProcess: TProcess;                            {Process object for command}
  stro: TMemoryStream;                             {Memory stream to get stdout}
  gotb, n: Integer;                                {Bytes got from stdout}
begin
  gotb:=0;                                         {nothing got from stdout yet}
  cmdProcess:= TProcess.Create(nil);
  stro:=TMemoryStream.Create;
  try
    cmdProcess.CommandLine:=cmdln;
    cmdProcess.ShowWindow:=swoHide;                {no black hole}
    cmdProcess.Options:=[poUsePipes];              {redirect stdin/stdout}
    cmdProcess.Execute;                            {execute the external command}
    while cmdProcess.Running do begin              {collect all data from stdout}
      stro.SetSize(szget+gotb);
      n:=cmdProcess.Output.Read((stro.Memory+gotb)^, szget);
      if n>0 then inc(gotb, n) else sleep(100);    {No data --> wait 100ms}
    end;
    repeat                                         {Handle final output}
      stro.SetSize(szget+gotb);
      n:=cmdProcess.Output.Read((stro.Memory+gotb)^, szget);
      if n>0 then inc(gotb, n);                    {Read the remaining data}
    until n<=0;                                    {Got all}
    stro.SetSize(gotb);
    outlist.LoadFromStream(stro);                  {Transfer memory to outlist}
  finally                                          {Remove objects from memory}
    cmdProcess.Free;
    stro.Free;
  end;
end;
 
 
Gruß HE

Warf
Beiträge: 2129
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: In Lazarus cmd öffen und direkt Befehl ausführen

Beitrag von Warf »

TProcess brauchst du nur wenn du spezielle sachen machen willst (z.b. input via stdin geben). Für das was du willst ist RunCommand vollkommen ausreichend und macht praktisch das selbe was HE da hat, nur halt schon vorimplementiert

JustusiusDE
Beiträge: 3
Registriert: Mi 4. Dez 2019, 19:45

Re: In Lazarus cmd öffen und direkt Befehl ausführen

Beitrag von JustusiusDE »

:mrgreen:
Zuletzt geändert von JustusiusDE am Do 5. Dez 2019, 16:02, insgesamt 1-mal geändert.

JustusiusDE
Beiträge: 3
Registriert: Mi 4. Dez 2019, 19:45

Re: In Lazarus cmd öffen und direkt Befehl ausführen

Beitrag von JustusiusDE »

Vielen Dank für die Antworten!
Ich werde es mir die Tage mal anschauen :)

Antworten