Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   unit für command line parameter (https://www.delphipraxis.net/202297-unit-fuer-command-line-parameter.html)

freimatz 17. Okt 2019 09:33

Delphi-Version: 5

unit für command line parameter
 
Hallo,
ich bin an einem neuen commandozeilen Tool dran. Da sollen auch Parameter (Dateinamen, Option) übergeben werden können. Klar könnte ich das mit ParamStr und so selber machen. Da gibt es aber sicher eine unit die dabei helfen kann. Ich meine mich zu erinnern an etwas wo man Option registrieren konnte.
Trotz einigem Googeln fand ich nichts fertiges.
Das hier macht das, deckt aber nur einen Spezialfall ab.
Hat mir jemand einen Tipp?

Uwe Raabe 17. Okt 2019 09:49

AW: unit für command line parameter
 
Da gibt es sicher mehrere. Eines ist das von Vincent Parret: https://github.com/VSoftTechnologies...mandLineParser

Der schöne Günther 17. Okt 2019 09:53

AW: unit für command line parameter
 
Wobei - Und das ist nur mein persönlicher Geschmack - ich denke dass man so etwas schneller selbst gebaut und auf seine eigenen Bedürfnisse zugeschnitten hat als sich in eine neue Library eingearbeitet, Lizenztexte gelesen und verstanden hat und und und.

Delphi-Quellcode:
program Project9;

{$APPTYPE CONSOLE}
{$R *.res}

uses System.SysUtils;

type
   TCommandLineArgs = record
      isVerbose:   Boolean;
      inputPath:   String;
      outputPath:   String;

      function ToString(): String; inline;
   end;

function getCommandLineArgs(const commandLine: String): TCommandLineArgs;
begin
   Result.isVerbose := FindCmdLineSwitch('isVerbose');
   if not FindCmdLineSwitch('inputPath', Result.inputPath) then
      Result.inputPath := String.Empty;
   if not FindCmdLineSwitch('outputPath', Result.outputPath) then
      Result.outputPath := String.Empty;
end;

{ TCommandLineArgs }

function TCommandLineArgs.ToString(): String;
begin
   Result :=
      String.Format('isVerbose: %d', [isVerbose.ToInteger()])
      + sLineBreak + String.Format('inputPath: "%s"', [inputPath])
      + sLineBreak + String.Format('outputPath: "%s"', [outputPath]);
end;

begin
   WriteLn( getCommandLineArgs(CmdLine).ToString() );
end.
ergibt

Code:
isVerbose: 1
inputPath: ""
outputPath: "C:\users\public\someFile.dat"
bei einem Aufruf mit
Code:
/isVerbose /outputpath:C:\users\public\someFile.dat
Für nicht allzu komplizierte Fälle reicht so etwas doch schon aus?

Jasocul 17. Okt 2019 11:06

AW: unit für command line parameter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mir irgendwann mal eine Mini-Komponente dafür gebastelt.
Das ist zwar völlig unkommentiert, aber bei ca. 100 Zeilen Code, kann man sich da wohl "einarbeiten".

Das war damals nur mal so hingepfuscht, aber vielleicht hilft es ja weiter.

TigerLilly 17. Okt 2019 11:16

AW: unit für command line parameter
 
Ein paar Ergänzungen:

https://github.com/benibela/rcmdline
https://www.thedelphigeek.com/2014/1...e-parsing.html
https://larsfosdal.blog/category/knowledge/code/delphi/

freimatz 17. Okt 2019 11:36

AW: unit für command line parameter
 
Danke an alle.

@Uwe: genau die hatte ich schon mal gesehen und mich vage daran erinnert. Die werde ich wohl auch nehmen. Sauber programmiert mit unit tests. Das sieht man leider selten.

@Günther: nun ja, ich will es ja nicht nur auf meine "eigenen Bedürfnisse" sondern die der Anwender. Und wenn da einer zum Beispiel statt "-i" ein "/i" nehmen will soll er es machen können ohne dass ich da was tun muss. Lizenztexte gelesen hat ca. 20 Sekunden gedauert "Apache" gelesen, bei uns im wiki nachgeschaut ob genehmigt - gut. ;-)
Ich fürchte das Tool wo ich gerade anfange wird auch mal ein komplizierter Fall, es riecht schon nach Fass ohne Boden. :wink:

TigerLilly 17. Okt 2019 11:53

AW: unit für command line parameter
 
Da ist noch einer:
https://osdn.net/projects/dzlib-tool...LineParser.pas

Siehe auch hier:
https://en.delphipraxis.net/topic/14...r-delphi-103x/

Dalai 17. Okt 2019 15:17

AW: unit für command line parameter
 
Zitat:

Zitat von freimatz (Beitrag 1449859)
Und wenn da einer zum Beispiel statt "-i" ein "/i" nehmen will soll er es machen können ohne dass ich da was tun muss.

Das kann in Delphi standardmäßig vorhandene Delphi-Referenz durchsuchenFindCmdLineSwitch schon.

PS: Diese Funktion verwende ich selbst für einige meiner Kommandozeilenprogramme.

Grüße
Dalai

freimatz 18. Okt 2019 10:37

AW: unit für command line parameter
 
Zitat:

Zitat von freimatz (Beitrag 1449859)
Und wenn da einer zum Beispiel statt "-i" ein "/i" nehmen will soll er es machen können ohne dass ich da was tun muss.

So deutlicher? :wink:

Rolf Frei 18. Okt 2019 13:31

AW: unit für command line parameter
 
Lies mal die Doku zu FindCmdLineSwitch. Da hst du einen Parameter bei dem du angeben kannst was für Switch-Zeichen erlaubt sein sollen. - (Unix) / (Windows) sind Standard und wer was anderes eingibt hat das nicht verstanden. Wieso du da also noch andere Zeichen dafür verwenden willst, ist mir ein Rätsel.

Aviator 18. Okt 2019 14:28

AW: unit für command line parameter
 
Zitat:

Zitat von Rolf Frei (Beitrag 1449908)
Lies mal die Doku zu FindCmdLineSwitch. Da hst du einen Parameter bei dem du angeben kannst was für Switch-Zeichen erlaubt sein sollen. - (Unix) / (Windows) sind Standard und wer was anderes eingibt hat das nicht verstanden. Wieso du da also noch andere Zeichen dafür verwenden willst, ist mir ein Rätsel.

Naja, auch wenn es einen Betriebssystem Standard gibt finde ich es trotzdem nicht schlecht, wenn man die Parameter sowohl mit "-" als auch mit "/" angeben kann. Die meisten Anwendungen die ich zumindest kenne machen das. Und es ist einfach auch bedienerfreundlicher.

Ich als Admin nutze z.B. auch viel Linux und Windows parallel. Wenn ich dann von einem Linux auf ein Windows System komme und dann statt einen "/" ein "-" für den Parameter eingebe und die Anwendung das auch akzeptiert, dann ist das natürlich umso besser.

Rolf Frei 18. Okt 2019 15:46

AW: unit für command line parameter
 
Ja natürlich wird beides unterstützt. Die Funktion erkennt standardmässig sowohl "-" als auch "/" als Switch-Zeichen. Wenn man noch zusätzliche will, kann man das mit einem Parameter angeben:

Delphi-Quellcode:
 
  // Checkt auf Vorhandensein des Switches -a /a
  if FindCmdLineSwitch('a') then
    WriteLn('Switch a ist gesetzt');

  // Checkt auf Vorhandensein der Switches *a !a -a /a
  if FindCmdLineSwitch('a', ['*', '!', '-', '/'], True) then
    WriteLn('Switch a ist gesetzt');

Aviator 18. Okt 2019 15:50

AW: unit für command line parameter
 
Zitat:

Zitat von Rolf Frei (Beitrag 1449911)
Ja natürlich wird beides unterstützt. Die Funktion erkennt standardmässig sowohl "-" als auch "/" als Switch-Zeichen. Wenn man noch zusätzliche will, kann man das mit einem Parameter angeben

Mir ist das bekannt. Ich hoffe freimatz (jetzt) auch. :)

Ich wollte es nur anmerken, da es bei dir ein bisschen so rüber kam (zumindest in meinen Augen), also ob man unter Windows gefälligst ein "/" und unter Linux ein "-" anzugeben hat. :cyclops:

Rolf Frei 18. Okt 2019 16:03

AW: unit für command line parameter
 
Zitat:

Zitat von Aviator (Beitrag 1449912)
Zitat:

Zitat von Rolf Frei (Beitrag 1449911)
Ja natürlich wird beides unterstützt. Die Funktion erkennt standardmässig sowohl "-" als auch "/" als Switch-Zeichen. Wenn man noch zusätzliche will, kann man das mit einem Parameter angeben

Mir ist das bekannt. Ich hoffe freimatz (jetzt) auch. :)

Ich wollte es nur anmerken, da es bei dir ein bisschen so rüber kam (zumindest in meinen Augen), also ob man unter Windows gefälligst ein "/" und unter Linux ein "-" anzugeben hat. :cyclops:

Ok da gebe ich dir recht. Wollte aber nur klar machen, dass das "-" Zeichen aus der Unix Welt kommt und das "/" aus der Windows Welt. Die Delphifunktion unterstützt beide Formate und nach Belieben noch weitere. Mir ist nur nicht klar wieso er da noch weitere braucht und die üblichen Zeichen aus der Unix/Windows Welt nicht reichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz