2009-05-07 18 views
13

No es mucho más fácil que usar getopt() para analizar parámetros de línea de comandos en C/C++.¿Hay una implementación de "getopt" para Delphi?

¿Hay algo similar para Delphi? ¿O idealmente, con la misma sintaxis? Sé que Delphi es compatible con FindCmdLineSwitch y ParamStr(), pero que aún requieren un análisis adicional.

Quiero algo que funcione como getopt() en C. Algo que permita fácilmente los conmutadores básicos, así como la captura de un valor después de un cambio. Véase más abajo para algunos ejemplo de código C para ver lo que estoy hablando:

void print_help() 
{ 
     printf("usage:\n") ; 
     printf("\t\t-i set input file\n") ; 
     printf("\t\t-o set output file\n") ; 
     printf("\t\t-c set config file\n") ; 
     printf("\t\t-h print this help information\n") ; 
     printf("\t\t-v print version\n") ; 
} 
char* input_file = NULL ; 
     char *query=NULL; 
      char opt_char=0; 
     while ((opt_char = getopt(argc, argv, "i:q:vh")) != -1) 
     { 
       switch(opt_char) 
       { 
         case 'h': 
           print_help(); 
           exit(-1); 
           break; 
         case 'v': 
           print_version() ; 
           exit(-1) ; 
           break ; 
         case 'i': 
           input_file= optarg ; 
           break ; 
         case 'q': 
           query= optarg ; 
           break ; 
         default: 
           print_help(); 
           exit(-1); 
           break; 
       } 
     } 

Respuesta

10

No es una implementación TGetOpt, afirmando

poner en práctica una variante getopt para Delphi. Es casi compatible con POSIX, admite opciones largas, obligatorio, opcional y sin argumentos

Lo puedes encontrar en here.

+0

Debería reemplazar * aquí * con algo como [Sandkasten: rutinas útiles para programas Delphi | stefan.huberdoc.at] (https://stefan.huberdoc.at/sandkasten/) - quién sabe que el sitio puede ir, y luego * aquí * no será útil. ... también dejan en claro que TGetOpt viene ** incluido en una colección **. – Wolf

+0

@ Wolf: no creo que eso agregue nada, ya que el navegador aún mostrará el destino del enlace y permitirá copiarlo en el portapapeles, incluso si el enlace está roto. De todos modos, toda la respuesta es de un tipo que se ha vuelto inapropiado para SO (enlace a recursos externos), y realmente no quiero subirlo a la página principal editándolo. – mghie

+0

Ya veo. Por otro lado, a menudo veo que los objetivos del enlace desaparecen pero su contenido se mueve, en estos casos el título de la página es absolutamente útil. Pero esta no es la única razón, usted puede echar un vistazo a [Por qué sus enlaces nunca deben decir "Haga clic aquí" - Smashing Magazine] (http://www.smashingmagazine.com/2012/06/links-should-never- say-click-here /) – Wolf

2

Nada incorporado, pero puede hacer uno bastante fácil. Esto debería estar cerca de lo que estamos acostumbrados a

TsoCommandLineParser = class 
private 
    fArguments:TStringList; 
public 
    constructor Create(); 
    destructor Destroy(); override; 

    function GetOpt(const pArgument:string; const pDefaultValue:string = ''):string; 
end; 


constructor TsoCommandLineParser.Create(); 
var 
    i:Integer; 
begin 
    inherited Create(); 
    fArguments := TStringList.Create(); 
    for i := 1 to ParamCount() do 
    begin 
    fArguments.Add(ParamStr(i)); 
    end; 
end; 

destructor TsoCommandLineParser.Destroy(); 
begin 
    fArguments.Free(); 
    inherited Destroy(); 
end; 

function TsoCommandLineParser.GetOpt(const pArgument:string; const pDefaultValue:string = ''):string; 
var 
    i:Integer; 
begin 
    i := fArguments.IndexOfName(pArgument); 
    if i > -1 then 
    begin 
    Result := fArguments.ValueFromIndex[i]; 
    end 
    else 
    begin 
    Result := pDefaultValue; 
    end; 
end; 
0

Ahí está el "Gastown Delphi analizador de línea de comandos", que fue recientemente de código abierto (por ejemplo on Torry's). Nunca lo he usado, así que no puedo comentarlo.

+0

¿Dónde puedo encontrar la fuente? Busqué en Google, pero no tuve suerte. – Mick

+0

Vaya, la sentada oficial desapareció. Pero http://www.vclcomponents.com/Delphi/System_Components/Gastown_Command_Line_Parser-info.html me parece kosher. Tal vez http://groups.google.de/group/borland.public.delphi.thirdpartytools.general/browse_frm/thread/1de12d1ad4f08f7 ayude también. –

3

¿Qué pasa con FindCmdLineSwitch en la unidad SysUtils?

if FindCmdLineSwitch('h',['-'],false) then 
    Print_Help(); 
if FindCmdLineSwitch('v',['-'],false) then 
    print_Version(); 

tendrá que bucle a través de los parametros para obtener los valores, pero eso es bastante simple de hacer:

if FindCmdLineSwitch('f',['-'],false) then 
    for ix := 1 to paramcount do 
    if (paramStr(ix) = '-f') and (ix < paramcount) then 
     begin 
     if fileExists(ParamStr(ix+1)) then 
      filename := ParamStr(ix+1); 
     break; 
     end 
+4

Getopt le permite combinar múltiples opciones en un solo argumento. También le permite estar seguro de que está procesando los argumentos en orden. Tiene disposiciones especiales para permitir argumentos que parecen opciones pero que realmente son nombres de archivos (como abrir un archivo cuyo nombre es "-f" en su ejemplo anterior). –

+0

ah, pero si alguien tiene un -f como nombre de archivo, y -f es un parámetro, ¿cómo sabría cuál fue cuál? – skamradt

+1

-f "-f" Tenga en cuenta que puede especificar si una opción toma un parámetro o no. –

10

El archivo de la FPC RTL getopts.pp es autónomo Delphi (Delphi2009 incluido) compatible que implementa getopt:

aplicación getopt para Free Pascal, el modelo de GNU getopt

El unit está disponible en el repositorio FPC SVN.

7

Consulte TCommandParser, descrito en este artículo de EDN http://edn.embarcadero.com/print/40404 y disponible para descargar en CodeCentral http://cc.embarcadero.com/item/27574. TCommandParser también debería incluirse en las demos de Delphi ahora. Hice que el código estuviera disponible gratuitamente para Embarcadero antes de irme, así que espero que lo incluyan en el marco o algo así en algún momento.

+4

Lo siento, lo olvidé: CommandParser está realmente * incluido * con las demos de Delphi disponibles en el IDE. –

+0

No puedo encontrar 'CommandParser' en las muestras incluidas, @ john-kaster. Además, los enlaces se han roto desde que publicó su respuesta. ¿Alguna idea de dónde podría encontrar tu clase ahora? – BigSmoke

+0

@BigSmoke ambos enlaces todavía funcionan para mí. Lo siento, todavía no está en las demostraciones. Aquí hay más información sobre esto. https://wiert.me/2015/05/13/on-the-delphi-tcommandparser-class-for-parsing-command-lines-and-arguments-via-suggestions-for-how-to-define-command- line-parameters-stack-overflow/ –

2

También hay un nuevo analizador llamado delphi-argparse que es relevante para esta pregunta.

1

Analizador basado en atributos para Delphi se puede encontrar here.

+0

Creo que el título de la página sería más seguro para el futuro que * aquí * - por ejemplo [Delphi Geek: análisis de línea de comandos basado en atributos] (http://www.thedelphigeek.com/ 2014/12/attribute-based-command-line-parsing.html) – Wolf

Cuestiones relacionadas