TProcess & (*) Parameter

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TProcess & (*) Parameter

Beitrag von Mathias »

Folgender Code lädt, wie erwartet die beiden Units in die Memo1.

Code: Alles auswählen

var
  AProcess: TProcess;
begin
  AProcess := TProcess.Create(nil);
  AProcess.Executable := '/bin/cat';
//  AProcess.Parameters.Add('*.pas');
  AProcess.Parameters.Add('unit1.pas');
  AProcess.Parameters.Add('unit2.pas');
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
 
  Memo1.Lines.LoadFromStream(AProcess.Output);

Ersetze ich die beiden Add Zeilen durch '*.pas', dann bleibt das Memo leer.

Gebe ich aber direkt in der Konsole

Code: Alles auswählen

cat *.pas
ein, dann wird der Text der beiden Units wie erwartet ausgegeben.

Wieso ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
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: TProcess & (*) Parameter

Beitrag von Socke »

Das *.pas wird nicht von cat in die verschiedenen Dateinamen aufgelöst sondern von deiner Konsole/Shell. Das Ganze heißt filename expansion oder globbing.
In Free Pascal kannst du das mit mit der Funktion FindAllFiles machen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

Kurz gesagt, TProcess ist/hat keine Shell. Damit geht das erweitern der Wildcards und anderes nicht. Siehe auch in der Wiki.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TProcess & (*) Parameter

Beitrag von Mathias »

Ich sehe da nicht durch.

Mache ich folgendes, anstelle von cat nehme ich ein Lazarus-Project und gebe diesem den *.pas Parameter mit, dann kommt dieser dort auch an.

Code: Alles auswählen

procedure TForm1.Button3Click(Sender: TObject);
var
  AProcess: TProcess;
begin
  AProcess := TProcess.Create(nil);
  AProcess.Executable := 'project1';
  AProcess.Parameters.Add('*.pas');
  AProcess.Parameters.Add('-para');
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
 
  Memo1.Lines.LoadFromStream(AProcess.Output); // Hier kommt alles schön retour, wie erwartet.
 
  AProcess.Free;
end;


Hier wird alles empfangen, inklusive *.pas .

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to  ParamCount do begin
    Writeln('Parameter ', i, '= ', ParamStr(i));
    ShowMessage(ParamStr(i));
  end;
end;


Wieso ist das bei /bin/cat nicht der Fall ?
Mit /bin/ls geht es auch nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: TProcess & (*) Parameter

Beitrag von MacWomble »

Ich habe das bei meinem Problem im anderen Thread so gelöst:

Code: Alles auswählen

RunCommand('sh -c "cat ' + QuellDatei + ' | formail -X FROM:  -X subject > ' + '/tmp/header.txt"' , Result);


Wichtig waren die umschließenden doppelten Anführungstzeichen. Auch bei mir trat das Problem in Verbindung mit cat auf, andere Befehlszeilen funktionieren auch hier.

Ich verwende RunCommand da ich es übersichtlicher finde, aber er ist als depricated markiert!
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten