Kommandozeilen-Parameter 1:1 weitergeben
Kommandozeilen-Parameter 1:1 weitergeben
Hallo Allerseits,
ich arbeite z.Zt. an einem Bootstrapper für ein Setup-Programm.
Der Bootstrapper muss die ihm übergebenen Kommandozeilen-Parameter 1:1 an das Setup weitergeben, wenn er dieses startet.
Kann ich irgendwo die komplette Kommandozeile abfragen?
Ich habe nur ParamStr() und das darunterliegende Argv gefunden.
Natürlich kann man die einzelnen Parameter wieder zu einem String zusammensetzen, aber dadurch gehen die doppelten Quotes (") verloren.
Diese sind in meinem Fall nicht einfach zu rekonstruieren, weil das Setup die Quotes an einigen Stellen benötigt (auch wenn keine Leerstellen im Parameter vorhanden sind), an anderer Stelle wieder Quotes nicht erlaubt.
Hat jemand eine Idee?
Danke
ich arbeite z.Zt. an einem Bootstrapper für ein Setup-Programm.
Der Bootstrapper muss die ihm übergebenen Kommandozeilen-Parameter 1:1 an das Setup weitergeben, wenn er dieses startet.
Kann ich irgendwo die komplette Kommandozeile abfragen?
Ich habe nur ParamStr() und das darunterliegende Argv gefunden.
Natürlich kann man die einzelnen Parameter wieder zu einem String zusammensetzen, aber dadurch gehen die doppelten Quotes (") verloren.
Diese sind in meinem Fall nicht einfach zu rekonstruieren, weil das Setup die Quotes an einigen Stellen benötigt (auch wenn keine Leerstellen im Parameter vorhanden sind), an anderer Stelle wieder Quotes nicht erlaubt.
Hat jemand eine Idee?
Danke
-
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: Kommandozeilen-Parameter 1:1 weitergeben
Wenn in einem paramstr(x) mindestens ein Leerzeichen enthalten ist, muß es logischerweise im Original Parameterstring in Anführungszeichen stehen. Also müßte man den ursprünglichen String meines Erachtens schon rekonstruieren können. Ob ' oder " als Anführungszeichen im Original steht, kann man allerdings nicht herausfinden.
Re: Kommandozeilen-Parameter 1:1 weitergeben
Hallo Martin V,
danke für die Antwort.
Das Problem ist, ich habe Parameter mit folgender Signatur:
/Param1=1 /Param2="a b c" /Joinparam:JoinParam1=45;JoinParam2="abc d";JoinParam3=" dkf dkf"
Das Problem hier ist, dass alles hinter /Joinparam nur ein Parameter ist, wobei z.B. bei JoinParam1 keine Quotes erlaubt sind.
Deshalb wäre es wirklich nötig den Commanline-String 1:1 zu übergeben.
Garby
danke für die Antwort.
Das Problem ist, ich habe Parameter mit folgender Signatur:
/Param1=1 /Param2="a b c" /Joinparam:JoinParam1=45;JoinParam2="abc d";JoinParam3=" dkf dkf"
Das Problem hier ist, dass alles hinter /Joinparam nur ein Parameter ist, wobei z.B. bei JoinParam1 keine Quotes erlaubt sind.
Deshalb wäre es wirklich nötig den Commanline-String 1:1 zu übergeben.
Garby
-
- 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: Kommandozeilen-Parameter 1:1 weitergeben
Du kannst bei der Funktion SysUtils.ExecuteProcess() die Parameter auch als array of String übergeben. Unter Linux können diese dann so wie sie sind (d.h. als array) an das andere Programm übergeben werden.
Unter Windows werden sie vorher noch in einen einzigen String zusammengefasst..
Vielleicht solltest du einmal testen, ob /Params="a b c" das gleiche wie "/Params=a b c" ist (dann sollte ExecuteProcess() wunderbar funktionieren). Bei mir unter Linux kommen in einem Shell-Script mit beim Parameter -param="a b c" keine Anführungszeichen mehr an.
Unter Windows werden sie vorher noch in einen einzigen String zusammengefasst..
Vielleicht solltest du einmal testen, ob /Params="a b c" das gleiche wie "/Params=a b c" ist (dann sollte ExecuteProcess() wunderbar funktionieren). Bei mir unter Linux kommen in einem Shell-Script mit beim Parameter -param="a b c" keine Anführungszeichen mehr an.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: Kommandozeilen-Parameter 1:1 weitergeben
Wenn " als Teil des paramstr(x) vorkommt, kann man mit ' den einzelnen Kommandozeilenparameter einklammern und umgekehrt. Wenn das nicht funktionieren sollte und Lazarus die paramstr(x) Werte falsch zuordnet (ich geh mal davon aus, daß es geht), wäre es ein Lazarus Bug.
Re: Kommandozeilen-Parameter 1:1 weitergeben
Hallo,
ich bin jetzt beim Recherchieren über die MSDN auf gestoßen.
Das läuft für mich bestens.
Danke
Garby
ich bin jetzt beim Recherchieren über die MSDN auf
Code: Alles auswählen
GetCommandLine()
Das läuft für mich bestens.
Danke
Garby
- willi4willi
- Lazarusforum e. V.
- Beiträge: 170
- Registriert: Sa 1. Nov 2008, 18:06
- OS, Lazarus, FPC: Lazarus 3.8 FPC 3.2.2 x86_64-win64-win32/win64 x86_64-linux-gtk2
- CPU-Target: i386, win64, arm
Re: Kommandozeilen-Parameter 1:1 weitergeben
Hallo,
unter Windows klappt das, wenn die Unit windows mit eingebunden ist.
gibt es GetCommandLine() auch unter Linux?
unter Windows klappt das, wenn die Unit windows mit eingebunden ist.
gibt es GetCommandLine() auch unter Linux?
Viele Grüße
Willi4Willi
------------
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Kommandozeilen-Parameter 1:1 weitergeben
Nein. Linux fuhrt auch kein Commandline aus, nur ein Array of pchar (string). Es gibt Commandline Varianten wie Execl, aber die sind niewilli4willi hat geschrieben:Hallo,
unter Windows klappt das, wenn die Unit windows mit eingebunden ist.
gibt es GetCommandLine() auch unter Linux?
für Komplexe formen bedacht (nur einfache Separation auf Spalten Basis)
Socke's ExecuteProcess Vorschlag oder Runcommand oder TProcess + arguments ist deshalb den besseren Weg.
Sieh zb http://wiki.freepascal.org/Executing_Ex ... RunCommand (offensichtlich Englisch, weil der Deutscher Wiki zu alt ist)