TProcess / CommandLine / Executable-Para

Antworten
maksh
Beiträge: 8
Registriert: Mo 18. Aug 2008, 15:37
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schaffhausen

TProcess / CommandLine / Executable-Para

Beitrag von maksh »

Hallo

ich hab ein TProcess mit einer Definition die Funktioniert und möchte nun das Ganze in Executable mit Parameter umsetzen
leider klappt das nicht.

Hier die funktionierende procedure

Code: Alles auswählen

procedure Test;
var
  AProcess  : TProcess;
begin
  AProcess             := TProcess.Create(nil);
  
  AProcess.CommandLine := 'sudo bash -c "echo 25 > /sys/class/backlight/pwm-backlight/brightness"';
  AProcess.Options    := AProcess.Options + [poUsePipes, poWaitOnExit];
  try
      AProcess.Execute();
  finally
    AProcess.Free;
  end;
end;
Versuch 1:

Code: Alles auswählen

procedure Test;
var
  AProcess  : TProcess;
begin
   AProcess            :=TProcess.Create(nil);
   
  AProcess.Executable := 'sudo';
  AProcess.Parameters.Add('bash');
  AProcess.Parameters.Add('-c');
  AProcess.Parameters.Add('"echo');
  AProcess.Parameters.Add('20');
  AProcess.Parameters.Add('>');
  AProcess.Parameters.Add('/sys/class/backlight/pwm-backlight/brightness"');

  AProcess.Options    := AProcess.Options + [poUsePipes, poWaitOnExit];
  try
      AProcess.Execute();
  finally
    AProcess.Free;
  end;
  

Versuch 2:

Code: Alles auswählen

procedure Test;
var
  AProcess  : TProcess;
begin
   AProcess            :=TProcess.Create(nil);
   
  AProcess.Executable := 'lxterminal';
  AProcess.Parameters.Add('-e');
  AProcess.Parameters.Add('sudo');
  AProcess.Parameters.Add('bash');
  AProcess.Parameters.Add('-c');
  AProcess.Parameters.Add('"echo 25 > /sys/class/backlight/pwm-backlight/brightness"');

  AProcess.Options    := AProcess.Options + [poUsePipes, poWaitOnExit];
  try
      AProcess.Execute();
  finally
    AProcess.Free;
  end;
  
Versuch 3:

Code: Alles auswählen

procedure Test;
var
  AProcess  : TProcess;
begin
   AProcess            :=TProcess.Create(nil);
   
  AProcess.Executable := 'lxterminal';
  AProcess.Parameters.Add('-e');
  AProcess.Parameters.Add('sudo');
  AProcess.Parameters.Add('bash');
  AProcess.Parameters.Add('-c');
  AProcess.Parameters.Add('"echo ');
  AProcess.Parameters.Add('50 ');
  AProcess.Parameters.Add('> ');
  AProcess.Parameters.Add('/sys/class/backlight/pwm-backlight/brightness"');

  AProcess.Options    := AProcess.Options + [poUsePipes, poWaitOnExit];
  try
      AProcess.Execute();
  finally
    AProcess.Free;
  end;
  
Alle Versuche klappen nicht.
Wie muss ich das Uûmsetzen?

PascalDragon
Beiträge: 829
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: TProcess / CommandLine / Executable-Para

Beitrag von PascalDragon »

maksh hat geschrieben:
Do 21. Apr 2022, 18:03
Alle Versuche klappen nicht.
Wie muss ich das Uûmsetzen?
Du brauchst eine Kombination aus Versuch 1 und Versuch 2: Nimm sudo als Executable und dann alle Parameter separat und den echo Aufruf als ein Parameter ohne Anführungszeinchen (TProcess kümmert sich da selbst drum, wenn der Parameter Leerzeichen enthält).
Außerdem kein poUsePipes, da es die Bash dann ist, welche Pipes nutzt, aber nicht dein eigener Prozess (das brauchst du nur, wenn du die Ausgabe wieder einlesen willst oder Eingaben weiterreichen möchtest).
Und zudem bitte das try von nach dem Create an, da zwischendrin ja auch eine Exception auftreten könnte.

Also:

Code: Alles auswählen

  AProcess := TProcess.Create(Nil);
  try
    AProcess.Executable := 'sudo';
    AProcess.Parameters.Add('bash');
    AProcess.Parameters.Add('-c');
    AProcess.Parameters.Add('echo 25 > /sys/class/backlight/pwm-backlight/brightness');
  
    AProcess.Options    := AProcess.Options + [poWaitOnExit];
    
    AProcess.Execute;
  finally
    AProcess.Free;
  end;
FPC Compiler Entwickler

Antworten