Kommandozeilen-Parameter 1:1 weitergeben

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Garby
Beiträge: 3
Registriert: Do 27. Jan 2011, 09:02

Kommandozeilen-Parameter 1:1 weitergeben

Beitrag von Garby »

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

Martin V
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

Beitrag von Martin V »

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.

Garby
Beiträge: 3
Registriert: Do 27. Jan 2011, 09:02

Re: Kommandozeilen-Parameter 1:1 weitergeben

Beitrag von Garby »

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

Socke
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

Beitrag von Socke »

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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Martin V
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

Beitrag von Martin V »

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.

Garby
Beiträge: 3
Registriert: Do 27. Jan 2011, 09:02

Re: Kommandozeilen-Parameter 1:1 weitergeben

Beitrag von Garby »

Hallo,

ich bin jetzt beim Recherchieren über die MSDN auf

Code: Alles auswählen

GetCommandLine()
gestoßen.
Das läuft für mich bestens.

Danke
Garby

Benutzeravatar
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

Beitrag von willi4willi »

Hallo,

unter Windows klappt das, wenn die Unit windows mit eingebunden ist.

gibt es GetCommandLine() auch unter Linux?
 

Viele Grüße

Willi4Willi

------------

marcov
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

Beitrag von marcov »

willi4willi hat geschrieben:Hallo,

unter Windows klappt das, wenn die Unit windows mit eingebunden ist.

gibt es GetCommandLine() auch unter Linux?
Nein. Linux fuhrt auch kein Commandline aus, nur ein Array of pchar (string). Es gibt Commandline Varianten wie Execl, aber die sind nie
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)

Antworten