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 |
Kommentare (0)
Trackbacks (0)
Hinterlasse einen Kommentar
Trackback