ExeuteProcess startet Parameter nicht

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

ExeuteProcess startet Parameter nicht

Beitrag von Maik81SE »

Moin @ll,

erst einmal einen Schönen Sonntag euch allen gewünscht. :D

Für mein derzeitiges Projekt ist aktuell ein Modul für das Update-Modul in Arbeit.
Dabei ist es mit meinen Kenntnissen aktuell Unumgänglich, mit einer Patch-Datei zu arbeiten, welche auch richtig erzeugt wird.

Da ich so wenig Parameter wie möglich übergeben will und auch ehrlich aus der Doku von ShellExecute nicht so richtig schlau werde, möchte ich ExecuteProzess verwenden.
Soweit auch kein Problem, jedoch wird mit mit der Zeile

Code: Alles auswählen

  ExecuteProcess('cmd.exe', 'run.bat', []);
nur das CMD-Fenster geöffnet, aber die run.bat nicht ausgeführt, unter Ubuntu wird die run.sh ausgeführt.

auch die Änderung des Befehles in

Code: Alles auswählen

  ExecuteProcess('cmd.exe', GetCurrentDir + 'run.bat', []);
bringt keinen Erfolg.

Der Vollständigkeit Halber die Komplette Unit

Code: Alles auswählen

unit main;

{$mode objfpc}{$H+}

interface

uses
  lclintf, classes, sysutils, forms, controls, graphics, dialogs, StdCtrls, ExtCtrls,
  fileinfo,
    winpeimagereader, elfreader, machoreader,
  registry,

  uconst {$ifdef Windows}, shellApi{$endif};

type

  { tform1 }

  TForm1                     = Class(TForm)
    Install_Btn              : TButton;
    label1, ProgName_Label,
    Version_Label            : TLabel;
    Timer1                   : TTimer;
    procedure FormShow(Sender: TObject);
    procedure Fnstall_Btnclick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    temp                     :String;
  public

  end;

var
  Form1 : TForm1;

const
  Drive = 'https://drive.google.com/drive/folders/15dl09_b1MF20vlvyjlb6BdI678z5jqSV?usp=sharing';

implementation

{$R *.lfm}

function  Version(Value: String): String;
var
  VI                         : TVersionInfo;
  Subver                     : byte         = 4;
  temp                       : String;
begin
  try
    VI                       := TVersionInfo.Create;
    VI.Load(Value);
    if SubVer > 0 then
      temp                   := IntToStr(VI.FixedInfo.FileVersion[0]) + '.';
    if SubVer > 0 then
      temp                   := Temp + IntToStr(VI.FixedInfo.FileVersion[1]) + '.';
    if SubVer > 0 then
      temp                   := Temp + IntToStr(VI.FixedInfo.FileVersion[2]) + '.';
    if SubVer > 0 then
      temp                   := Temp + IntToStr(VI.FixedInfo.FileVersion[3]);
  finally
    VI.Free;
  end;
  result                     := temp;
end;

{ tform1 }

procedure TForm1.FormShow(Sender: TObject);
var
  Reg                        : TRegistry;
begin
  Reg                        := TRegistry.Create;
  try
    Reg.RootKey              := HKeyUser;
    Reg.OpenKeyReadOnly(MasterKey);
    temp                     := Reg.ReadString('UserDir');
  finally
    Reg.Free;
  end;
  if MessageDLG('Achtung.' + #13 +
                'Für das Update wird eine AKTIVE Internetverbindung benödigt. Sollten Sie das erste ' +
                'mal ein Update durchführen, besteht die Möglichkeit, das es eine Freigabe auf den ' +
                'Update-Server bedarf.' + #13 + #13 +
                'Dies kann unter umständen einige Stunden dauern, da die Freigaben durch den ' +
                'Projektverantwortlichen persönich erfolgt.', mtInformation, mbOKCancel, 0) = mrOK then begin
    ProgName_Label.Caption   := 'Programm -> Addison Tagebuch';
    Version_Label.Caption    := 'Version auf PC: ' + Version(
    {$ifdef windows}temp
    {$else ifdef Unix}GetUserDir + 'Entwicklung/Gesundheit/Morbus_Addision/linux/'
    {$endif} + Prog_Name);
    if not FileExists(GetUserDir + 'Downloads' + PathDelim + Prog_Name) then
      OpenURL(Drive);
    end;
end;

procedure TForm1.Install_BtnClick(Sender: TObject);
var
  _UpDate                    : TStringList;
begin
  _UpDate                    := TStringList.Create;
  With _UpDate do begin
    add('cd ' + GetUserDir + 'Downloads');
    add({$ifdef Windows}'move '
        {$else ifdef Unix}'mv '{$endif} + Prog_Name + ' ' + Temp);
    end;
  {$ifdef Windows}
  _UpDate.SaveToFile('run.bat');
  ExecuteProcess('cmd.exe', GetCurrentDir + 'run.bat', []);
  {$else ifdef Unix}
  _UpDate.SaveToFile('run.sh');
  ExecuteProcess('/usr/bin/exo-open', '.' + GetCurrentDir + '/run.sh', []);
  {$endif}
  _UpDate.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if FileExists(GetUserDir + 'Downloads' + PathDelim + Prog_Name) then begin
    if Version(temp + Prog_Name) =
       Version(GetUserDir + 'Downloads' + PathDelim + Prog_Name) then
         Label1.Caption      := 'Ihre Version ist Aktuell'
       else
         Label1.Caption      := 'Version zur Installation:' + Version(GetUserDir + 'Downloads' + PathDelim + Prog_Name);
    Label1.Visible           := True;
    Timer1.Enabled           := False;
    end;
end;

end.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

PascalDragon
Beiträge: 834
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: ExeuteProcess startet Parameter nicht

Beitrag von PascalDragon »

Maik81SE hat geschrieben:
So 18. Feb 2024, 14:14
Soweit auch kein Problem, jedoch wird mit mit der Zeile

Code: Alles auswählen

  ExecuteProcess('cmd.exe', 'run.bat', []);
nur das CMD-Fenster geöffnet, aber die run.bat nicht ausgeführt, unter Ubuntu wird die run.sh ausgeführt.
Hast du dir die entsprechende Hilfe der cmd.exe angeschaut?

V.a. das hier:

Code: Alles auswählen

PS C:\Users\Sven> cmd.exe /?
Startet eine neue Instanz des Windows Befehlsinterpreters.

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] Zeichenfolge]

/C      Führt den Befehl in der Zeichenfolge aus und endet dann.
/K      Führt den Befehl in der Zeichenfolge aus und endet dann nicht.
[...]
Wird /C oder /K angegeben, wird der Rest der Befehlszeile nach der Option als
Befehlszeile verarbeitet, wobei folgende Logik zur Verarbeitung des doppelten
Anführungszeichens (") gilt:
[...]
FPC Compiler Entwickler

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: ExeuteProcess startet Parameter nicht

Beitrag von shokwave »

Wenn du wirklich nur eine Datei verschieben willst, kannst du das auch mit CopyFile() und DeleteFile() machen.

Code: Alles auswählen

uses ..., fileutil;

function MoveFile(ASource, ADestination: String): Boolean;
begin
  Result:= CopyFile(ASource, ADestination);
  if Result then begin
    Result:= Result and DeleteFile(ASource);
  end;
end;
Da könntest du auch noch ein bisschen Fehlerbehandlung mit einbauen.
mfg Ingo

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

[Gelöst] ExeuteProcess startet Parameter nicht

Beitrag von Maik81SE »

PascalDragon hat geschrieben:
So 18. Feb 2024, 14:36

nur das CMD-Fenster geöffnet, aber die run.bat nicht ausgeführt, unter Ubuntu wird die run.sh ausgeführt.
Hast du dir die entsprechende Hilfe der cmd.exe angeschaut?
[/quote]

Da muß ich zugeben, das ich dieses nicht ausfindig machen konnte. :shock:
Nicht verwunderlich, wenn man 99,5 % seiner Anwendungen ausschließlich für Unix schreibt.
Da vergisst man (zumindest kann ich es für meinen Teil mir auch eingestehen), das in der console / und - den feinen unterschied machen.
shokwave hat geschrieben:
So 18. Feb 2024, 15:47
Wenn du wirklich nur eine Datei verschieben willst, kannst du das auch mit CopyFile() und DeleteFile() machen.

Code: Alles auswählen

uses ..., fileutil;

function MoveFile(ASource, ADestination: String): Boolean;
begin
  Result:= CopyFile(ASource, ADestination);
  if Result then begin
    Result:= Result and DeleteFile(ASource);
  end;
end;
Da könntest du auch noch ein bisschen Fehlerbehandlung mit einbauen.
wie sind da deine Persönlichen Erfahrungen mit *.exe,obgleich dies für User, welche sich nicht mit PCs auskennen und nur das Nötigste machen, sicherlich von Vorteil wäre, wenn eine Fehlerbehandlung inklusive ist.
2te Frage?
Wie ist deine Funktion geeignet, wenn es mehrere Dateien betrifft?`
Später soll auch die Doku mit in das UpDate gepackt werden.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: [Gelöst] ExeuteProcess startet Parameter nicht

Beitrag von shokwave »

Maik81SE hat geschrieben:
So 18. Feb 2024, 18:30
wie sind da deine Persönlichen Erfahrungen mit *.exe,obgleich dies für User, welche sich nicht mit PCs auskennen und nur das Nötigste machen, sicherlich von Vorteil wäre, wenn eine Fehlerbehandlung inklusive ist.
Ehrlich gesagt verstehe ich die Frage gerade nicht so richtig. Fallst du wissen möchtest, ob ich schon mal einen eigenen Updater gebaut habe, muss ich das leider verneinen. Aber ich kann dir sagen, dass unter Windows es nicht möglich ist eine Datei zu überschreiben, die gerade in Benutzung ist. Das heißt dein Programm, das du updaten willst, muss geschlossen sein.
Maik81SE hat geschrieben:
So 18. Feb 2024, 18:30
2te Frage?
Wie ist deine Funktion geeignet, wenn es mehrere Dateien betrifft?`
Später soll auch die Doku mit in das UpDate gepackt werden.
Der Code sollte dir nur zeigen wie du eine Datei verschieben kannst, da es das ist, was du in deinem Code derzeit machst. Es hält dich natürlich niemand davon ab, diese Funktion so oft aufzurufen wie du willst. Z.B. in einer Funktion die eine Liste von Dateien verarbeitet, die verschoben werden sollen.
Praktischer Weise könnte man dem Update diese Liste als Textdatei, INI ,o.ä. beilegen.

Beantwortet das deinen Fragen?
mfg Ingo

icho2099
Beiträge: 22
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

Re: ExeuteProcess startet Parameter nicht

Beitrag von icho2099 »

Aber ich kann dir sagen, dass unter Windows es nicht möglich ist eine Datei zu überschreiben, die gerade in Benutzung ist. Das heißt dein Programm, das du updaten willst, muss geschlossen sein.
dazu gibt es einen kleinen Umweg. Die gerade laufende exe kann sich selber umbenennen.
Danach kann die neue exe problemlos geschrieben werden. Wenn die neue exe nach dem Start die
umbenannte Datei löscht, dann geht das beliebig oft.
Riskant ist das aber schon, es kann sich so jeder Bösewicht einschleichen.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] ExeuteProcess startet Parameter nicht

Beitrag von Maik81SE »

shokwave hat geschrieben:
So 18. Feb 2024, 19:14
Maik81SE hat geschrieben:
So 18. Feb 2024, 18:30
wie sind da deine Persönlichen Erfahrungen mit *.exe,obgleich dies für User, welche sich nicht mit PCs auskennen und nur das Nötigste machen, sicherlich von Vorteil wäre, wenn eine Fehlerbehandlung inklusive ist.
Ehrlich gesagt verstehe ich die Frage gerade nicht so richtig. Fallst du wissen möchtest, ob ich schon mal einen eigenen Updater gebaut habe, muss ich das leider verneinen. Aber ich kann dir sagen, dass unter Windows es nicht möglich ist eine Datei zu überschreiben, die gerade in Benutzung ist. Das heißt dein Programm, das du updaten willst, muss geschlossen sein.
auf was hinaus wollte.
Ob dir bekannt ist, wie sich dein Vorschlag auf Daten der Größenordnung 30MB aufwärts auswirkt?
icho2099 hat geschrieben:
Mo 19. Feb 2024, 07:51

dazu gibt es einen kleinen Umweg. Die gerade laufende exe kann sich selber umbenennen.
Danach kann die neue exe problemlos geschrieben werden. Wenn die neue exe nach dem Start die
umbenannte Datei löscht, dann geht das beliebig oft.
Riskant ist das aber schon, es kann sich so jeder Bösewicht einschleichen.
Danke schon mal für den Hinweiß.

Ich bin mir sicher, das ich nächste Woche genau auf dieses Problem stoßen könnte.
Zugegeben, wenn nicht ich, dann einer der User, für welche ich gerade an dem Primären-Projekt schreibe.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

CCRDudeLaz
Beiträge: 29
Registriert: Do 25. Jan 2024, 08:33
OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
CPU-Target: 32+64

Re: ExeuteProcess startet Parameter nicht

Beitrag von CCRDudeLaz »

Ich finde es sehr praktisch, einfache Installer als Update-Dateien zu verwenden. Die können sich dann um alles kümmern, teils sogar ohne noch viel tun zu müssen - um's Beenden und Neustarten von Prozessen, Systemdiensten, &c.

Antworten