Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Articles

Parameter und Schalter in Konsolenanwendungen

Und am siebten Tage schuf Microsoft die Konsole. – So oder so ähnlich könnte man heute auf die Vergangenheit der modernen, fensterbasierenden Programmierung zurückblicken. Vorbei die Zeit in der ominöse kleine schwarze Kommandozeilen über unsere Monitore flackerten und auf Benutzereingaben warteten.

Parameter und Schalter in Konsolenanwendungen

Doch hin und wieder ertappt man sich selber, wie man wieder in gewohnte Muster zurückfällt und auf eine ansehliche Oberfläche verzichtet. Genau hier möchte ich mit dem ersten Blog-Eintrag einhaken. Wie sollte ein solches Projekt beginnen? Was ist zu beachten?

Das Erste, womit man sich beschäftigen sollte, sofern benötigt, ist die Übergabe von Parametern und Schaltern.

Wer den Parameter nicht ehrt, ist die Anwendung nicht wert!

Bei mir ein gern genutztes Sprichwort. In den meisten Anwendungen ist es sinnvoll, dem Nutzer die Möglichkeit zu bieten, die Nutzung der Anwendung zu optimieren, indem er Parameter oder Schalter hinzufügen kann. Ich denke, jeder hat solche Konsolenanwendungen bereits gesehen.

Da es sich hier um eine Norm im Bereich der Entwicklung handelt, werden Parameter grundsätzlich mit einem Bindestrich und Schalter mit einem Schrägstrich begonnen, so dass wir folgendes Muster erhalten:
 

Programm.exe -a para1 -b para2 /schalter1 /schalter2

Diese Werte sollten optimal vom Programm abgefangen werden, ohne aber zu viel Zeit darauf zu verschwenden. Ich nutze hierfür immer gerne eine kleine Parameter-Klasse. Diese besteht aus allen Variablen, die über Parameter (int, string, char, double, etc.) oder Schalter (bool) übergeben werden können. Zusätzlich enthält sie noch zwei Funktionen mit denen es möglich ist, zu überprüfen, welche Werte ein entsprechender Parameter hat oder ob ein Schalter aktiviert ist.

Die Grundfunktionen (C#):

// Parameter auswerten
private string GetArgument(string ArgName)
{
  // Alle Parameter durchlaufen
  for (int i = 0; i < Arguments.Length; i++)
  {
    // Wurde das Keyword gefunden, Wert zurückliefern
    // Hierbei wird auf den Bindestrich geprüft und ob ein Wert folgt
    if (Arguments[i] == "-" + ArgName && Arguments.Length >= i)
    {
      return Arguments[i + 1];
    }
  }
  // Wenn nichts gefunden wurde, Leerstring zurückgeben
  return "";
}
 
// Schalter auswerten
private bool GetSwitch(string SwitchName)
{
    // Alle Parameter durchlaufen
    foreach (string item in Arguments)
    {
        // Wurde ein Schalter gefunden, TRUE zurückgeben
        // Beim Schalter prüfen wir auf den Schrägstrich
        if (item.Contains("/" + SwitchName)) return true;
    }
    return false;
}

Hiermit habe ich nun zwei Funktionen die mir, mit Übergabe der Namen der Parameter oder Schalter, die passenden Werte zurückliefern. Optimal lässt sich dies in der Parameter-Klasse im Konstruktor einbauen, so dass man direkt ein entsprechendes Objekt nutzen kann, ohne weiter auf die Funktionen zurückzugreifen.

Die gesamte Klasse (C#):

namespace MyProgramm
{
    class ArgumentHandler
    {
        // Übergabevariablen
        protected static string[] Arguments;
 
        // Variablendeklaration
        protected string para1;
        protected long para2;
        protected int para3;
 
        protected bool switch1;
        protected bool switch2;
 
        // Getter & Setter
        public string Para1 { get { return _para1; } }
        public long Para2 { get { return _para2; } }
        public int Para3 { get { return _para3; } }
 
        public bool Switch1 { get { return _switch1; } }
        public bool Switch2 { get { return _switch2; } }
 
        // Konstruktor
        public ArgumentHandler(string[] args)
        {
            Arguments = args; // Diese liefert mir meine Main-Klasse
 
            // Variableninitialisierung
            _para1 = "";
            _para2 = 0;
            _para3 = 0;
 
            _switch1 = false;
            _switch2 = false;
        }
 
        // Prüfen, ob Kernelemente gesetzt sind
        public bool CheckArguments()
        {
            try
            {
                _para1 = GetParameter("para1");
                long.TryParse(GetParameter("para2"), out _para2);
                int.TryParse(GetParameter("para3"), out _para3);
 
                _switch1 = GetSwitch("switch1");
                _switch2 = GetSwitch("switch2");
 
                // Prüfen ob vorhanden
                if (string.IsNullOrEmpty(_para1.ToString())) { return false; }
                if (_para2 <= 0) { return false; }
                if (_para3 <= 0) { return false; }
            }
 
            catch
            {
                return false;
            }
 
            return true;
        }
 
        private string GetArgument(string ArgName)
        {
            for (int i = 0; i < Arguments.Length; i++)
            {
                if (Arguments[i] == "-" + ArgName && Arguments.Length >= i)
                {
                    return Arguments[i + 1];
                }
            }
            return "";
        }
 
        private bool GetSwitch(string SwitchName)
        {
            foreach (string item in Arguments)
            {
                if (item.Contains("/" + SwitchName)) return true;
            }
            return false;
        }
    }
}

Wie immer gilt: Dies ist freier Code, Ihr könnt Ihn einsetzen, wie und wo Ihr wollt!

Leave a comment  

name*

email*

website

Submit comment