Startseite > .NET, C# > Konsolenprogramme und Parameter-Parser

Konsolenprogramme und Parameter-Parser


Es ist eigentlich schade, dass .NET out-of-the-box kein Parser für den Commandline hat. So erfindet jeder das Rad immer wieder neu. Ich habe jetzt Schätzungsweise 1 Milliarde* verschiedene Parser gesehen. Von einfach bis leicht Kompliziert bis hin zu Professionell. Keines davon hat mich so richtig überzeugt. Das Meiste finde ich einfach zu überladen; zu viel unnötiges Zeugs. Deshalb habe ich was eigenes gebastelt. Sehr einfach zu benutzen und gut geeignet für kleinere Programme oder simple Parameterübergaben.

Beispiel:

C#
1
23
45
67
89
1011
1213
1415
16
ParamHandler ph = new ParamHandler();
 ph.Parameters.Add(new ParamHandler.ParamHandlerItems("-path", "Zielordner"));
ph.Parameters.Add(new ParamHandler.ParamHandlerItems("-d", "Alle Bilder downloaden"));ph.Parameters.Add(new ParamHandler.ParamHandlerItems("-url", "Url eingeben"));
 ph.Execute(args);
 ph.Syntax = "[[-path] <string>] [-d] [[-url] ]";
ph.UsageExample = "-url=http://www.google.de/images?q=jigsaw -d -path=C:\temp";  if (ph.Parameters[ph.Help].HasValue)    ph.ShowHelp();
 if (ph.Parameters["-d"].HasValue)...
 
GeSHi 1.0.8.8

 

Source Code:

C#
1
23
45
67
89
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
7273
7475
7677
7879
8081
8283
8485
8687
8889
9091
9293
9495
9697
9899
100101
102103
104105
106107
108109
110111
112113
114115
116117
118119
120121
122123
124125
126127
128129
130131
132133
134135
136137
138139
140141
142143
144145
146147
148149
150151
152153
154155
156157
158159
160161
162163
164165
166167
168169
170171
172173
174175
176177
178179
180181
182183
184185
186187
188189
190191
192193
194195
196197
198
using System;
using System.Collections.ObjectModel;using System.Collections.Specialized;
using System.Reflection;  namespace ClassPak{
    /// <summary>    /// Vereinfacht die Auswertung von übergebenen Parametern
    /// </summary>    public class ParamHandler
    {        /// <summary>
        /// Die Parameter und die Werte        /// </summary>
        public class ParamHandlerItems        {
            /// <summary>            /// Constructor
            /// </summary>            /// <param name="parameter">Parameter tag<!--param>
            /// <param name="description">Eine kurze Beschreibung des Parameters<!--param>            public ParamHandlerItems(string parameter, string description)
            {                Parameter = parameter;
                Description = description;            }
             /// <summary>
            /// Constructor            /// </summary>
            /// name="parameter">Parameter Tag</param>            public ParamHandlerItems(string parameter)
            {                Parameter = parameter;
            }              /// <summary>            /// Ruft einen Wert ab, das den Tag eines Parametes angibt, oder legt diesen fest. ZB.: -h ode /? oder -?
            /// </summary>            public string Parameter { get; set; }
            /// <summary>            /// Ruft einen Wert ab, das den Parameter kurz beschreibt, oder legt diesen fest.
            /// </summary>            public string Description { get; set; }
             private string _value;
            /// <summary>            /// Ruft einen Wert ab, das den Wert des Parameters angibt, oder legt diesen fest
            /// </summary>            public string Value
            {                get
                {                    return _value;
                }                set
                {                    _value = value;
                    _hasvalue = true;                }
            }              private bool _hasvalue=false;            /// <summary>
            /// Ruft einen Wert ab, das angibt ob der Parameter einen Wert erhalten hat oder nicht            /// </summary>
            public bool HasValue { get { return _hasvalue; } }        }
         /// <summary>
        /// Eine Kollektion der Items        /// </summary>
        public class ParamHandlerItemsCollection : KeyedCollection<string, ParamHandlerItems>        {
            /// <summary>            /// Constructor
            /// </summary>            public ParamHandlerItemsCollection() : base() {}
             /// <summary>
            /// Wird ausgeführt, wenn ein Element über den Schlüssel aufgerufen wird.            /// </summary>
            /// name="item">            /// <returns></returns>
            protected override string  GetKeyForItem(ParamHandlerItems item)            { return item.Parameter; }
         }
         public StringCollection ParametersDefault { get; set; }
         /// <summary>
        /// Die Parameter und deren Werte        /// </summary>
        public ParamHandlerItemsCollection Parameters { get; set; }        /// <summary>
        /// Ruft einen Wert ab, das angibt wie die Parameter benutzt werden kann, oder legt diesen fest.        /// </summary>
        public string UsageExample { set; get; }        /// <summary>
        /// Ruft einen Wert ab, das angibt wie der Syntax lautet, oder legt diesen fest.        /// </summary>
        public string Syntax { get; set; }        private char[] _delimeter = new char[] {'='};
        /// <summary>        /// Ruft einen Wert ab, das angibt welches Zeichen als Trennzeichen zwischen Parameter und
        /// Parameterwert genutzt werden soll, oder legt diesen fest.        /// </summary>
        public char[] Delimeter        {
            get { return _delimeter; }            set { _delimeter = value; }
        }          /// <summary>        /// Standard Parameter für Hilfe
        /// </summary>        private string _help = "--help";
        public string Help        {
            get { return _help; }            set { _help = value; }
        }          /// <summary>        /// Constructor
        /// </summary>        public ParamHandler()
        {            Parameters = new ParamHandlerItemsCollection();
        }          /// <summary>        /// Zeigt eine Vorgefertigte Hilfe Seite an
        /// </summary>        public void ShowHelp()
        {            Assembly assy= Assembly.GetCallingAssembly();
             Console.WriteLine("\n\nNAME\n\t" + assy.GetName().Name + " v" + assy.GetName().Version);
            Console.WriteLine("\n\nDESCRIPTION\n\t" + ((AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(assy,                typeof(AssemblyDescriptionAttribute))).Description);
             if (Parameters.Count > 0)
            {                if(UsageExample.Length>0)
                    Console.WriteLine("\n\nUSAGE EXAMPLE\n\t" +                        System.AppDomain.CurrentDomain.FriendlyName +" " + UsageExample);
                 if (Syntax.Length > 0)
                    Console.WriteLine("\n\nSYNTAX\n\t" +                        System.AppDomain.CurrentDomain.FriendlyName + " " + Syntax);
                 Console.WriteLine("\n\nPARAMETERS");
                 for (int i = 0; i < Parameters.Count; i++)
                {                    Console.WriteLine("\t" + Parameters[i].Parameter.PadRight(18, ' ') + Parameters[i].Description);
                }            }
            Console.WriteLine("");        }
         /// <summary>
        /// Zieht aus den übergebenen Parameterliste die Werte der Parameter heraus        /// </summary>
        /// name="args">Parameterliste -> kommt von Main(string[] args)</param>        public void Execute(string[] args)
        {            //Add help parameter if not already added
            if (!Parameters.Contains(Help))                Parameters.Add(new ParamHandlerItems(Help, "Show help"));
             string[] param;
            foreach (string arg in args)            {
                param = arg.Split(Delimeter, 2);                  if (param.Length == 1 && Parameters.Contains(param[0]))                {
                    Parameters[param[0]].Value = param[0];                }
                else if (param.Length > 1)                {
                    if (Parameters.Contains(param[0]))                        Parameters[param[0]].Value = param[1];
                    else                        throw new Exception("Invalid or unknown Parameter");
                }                else if (arg.Length > 0)
                    ParametersDefault.Add( param[0] );            }
        }      }}
 
GeSHi 1.0.8.8
Kategorien:.NET, C#
  1. Du hast noch keine Kommentare.
  1. No trackbacks yet.

Hinterlasse einen Kommentar