Realisierung einer Mehrfachauswahl (Multiple-Choice)
Dieser Artikel befasst sich mit der Auswahl mehrerer Optionen durch Benutzereingaben oder Dialogfenster. Primär geht es um einen Lösungsweg für Befehlsdateien oder Scripte. Neben der Eingabe im Konsolenfenster wird aber auch die Auswahl auf GUI-Ebene behandelt. Für beide Umgebungen werden Verfahren basierend auf den standardmäßig in Windows vorhandenen Möglichkeiten vorgestellt.
Windows-Konsole
In Befehlsdateien kann das Konsolenprogramm Choice (choice.exe) verwendet werden:
choice /c 123 /n /m "1 = Option 1, 2 = Option 2, 3 = Option 3" echo %errorlevel%
Die Auswahl wird durch Betätigung einer gültigen Ziffern- oder Buchstabentaste getroffen. Der Exitcode entspricht dem Index der gewählten Option. Er beträgt 255 bei ungültiger Syntax.
Auf diese Weise kann allerdings nur eine Option ausgewählt werden.
Um die Wahl mehrerer Optionen zu erlauben, kann man die folgende Methode anwenden:
@echo off echo Wahlmöglichkeiten: echo 1. Option 1 echo 2. Option 2 echo 3. Option 3 set /p _input=Bitte geben Sie die Nummern Ihrer Auswahl ein (z.B. 1,3): echo %_input%
Hier können mehrere Zahlen eingeben werden. In Hinblick auf die weitere Verarbeitung (sowie die Möglichkeit zweistelliger Zahlenwerte bei mehr als 9 Optionen) ist eine Kommatrennung nützlich.
Im Prinzip können die Optionsnummern dann einfach abgearbeitet werden:
for %%X in (%_input%) do echo %%X
Bei einer größeren Anzahl wird die Eingabe aller einzelnen Nummern unbequem und man wird zusätzlich die Angabe von Bereichen wie »3-5« ermöglichen wollen. Solche gemischten Auswahlformen finden sich in vielen Dialogen und sind Benutzern daher im Allgemeinen vertraut.
Die Auswertung wird dadurch deutlich komplizierter. Vor allem müssen bei Bereichsangaben die Zwischenwerte ermittelt werden. Zweckmäßigerweise erzeugt man dabei eine neue, erweiterte Nummernliste, die sich wieder in einer For-Schleife verarbeiten lässt.
Ich habe eine Befehlsdatei geschrieben (multichoice.bat), die das erledigt. Diese Datei dient in erster Linie Demonstrationszwecken, sie enthält neben der Auswertung einen einfachen Eingabeprompt und eine Anzeige der endgültigen Nummernliste. Sie können die Datei aber leicht für Ihre Zwecke anpassen, indem Sie die Anzeige und Auswahl der Optionen in gewünschter Weise ergänzen.
Für die praktische Verwendung sind jedoch eher die beiden Befehlsdateien options.bat und mchoice.bat gedacht, bei denen eine Trennung zwischen der Auswahl und Verarbeitung von Optionen (options.bat) sowie der Eingabeauswertung (mchoice.bat) erfolgt ist. Hier können Anpassungen auf die Datei options.bat beschränkt bleiben.
Grundsätzlich stellt die Optionsauswahl per Zahleneingabe eine Schwachstelle dar, da eine Reihe unkorrekter Eingaben möglich ist. Auch ist die mehrfache Eingabe derselben Optionsnummern nicht ausgeschlossen.
Die Überprüfung auf Fehleingaben kann recht mühsam und aufwändig sein. Die vorliegende Befehlsdatei (mchoice.bat) verzichtet weitgehend auf solche Überprüfungen. (Bei einer Bereichsangabe i1-i2 wird auf i2>i1 geprüft.) Falsche Nummern oder Buchstaben sind in der Regel eher unkritisch. Es sind jedoch Eingaben denkbar, die bei der Verarbeitung Probleme bereiten. Nehmen Sie ggf. aufgrund eigener Tests entsprechende Prüfungen auf. Bei einer kleinen Anzahl von Optionen könnte die Bereichseingabe zur Vereinfachung weggelassen werden.
GUI-Fenster
In ähnlicher Weise kann eine Mehrfachauswahl mit VBScript realisiert werden. Für die Anzeige und Eingabe der Optionen außerhalb einer Konsole ist die Funktion InputBox verfügbar.
prompt = "Wahlmöglichkeiten:" & vbNewLine & _ "1. Option 1" & vbNewLine & _ "2. Option 2" & vbNewLine & _ "3. Option 3" & vbNewLine & _ "Bitte geben Sie die Nummern Ihrer Auswahl ein (z.B. 1,3)." input = InputBox(prompt, "Auswahl")
Im Übrigen gilt für die Vorgehensweise das oben Gesagte. Die Auswertung der Eingabe kann hier durch die in VBScript verfügbaren Mittel (Stringfunktionen, RegExp-Objekt) erfolgen. Eine Beispielanwendung findet sich in multichoice.vbs. Auch hier habe ich zusätzlich eine Trennung von Optionswahl (options.vbs) und Eingabeauswertung (mchoice.vbs) vorgenommen. Wiederum findet ein wechselseitiger Aufruf zwischen beiden Dateien statt. Auch die Verwendung der Befehlsdatei mchoice.bat wäre möglich, wie in options.vbs angedeutet. Und umgekehrt könnte die Konsoleneingabe options.bat das Script mchoice.vbs aufrufen.
Ein anderer Lösungsweg steht über die HTML-Applikation (HTA) offen. Dabei handelt es sich, vereinfacht gesagt, um eine ausführbare HTML-Datei, bei deren Verwendung typischerweise HTML-Steuerelemente mit VBScript- oder JScript-Funktionen kombiniert werden. Das ausführende Programm mshta.exe ist standardmäßiger Bestandteil von Windows.
Das Dialogfenster ließe sich bspw. so definieren:
<body> <p> Wählen Sie die gewünschten Optionen aus: </p> <p> <input type="checkbox" name="chkOpt1"/>Option 1<br> <input type="checkbox" name="chkOpt2"/>Option 2<br> <input type="checkbox" name="chkOpt3"/>Option 3 </p> <p> <input type="button" value="OK" name="btnOK"/> <input type="button" value="Abbrechen" name="btnCancel"/> </p> </body>
Im Kopfteil der HTA-Datei befinden sich VBScript-Prozeduren, die das Auslösen der beiden Schaltflächen verarbeiten:
<html> <head> <title>Auswahlfenster</title> <script language="vbscript"> Sub btnOK_onClick Dim msg msg = "" If chkOpt1.checked = True Then msg = msg & "1" & vbNewLine ' process option 1 End If If chkOpt2.checked = True Then msg = msg & "2" & vbNewLine ' process option 2 End If If chkOpt3.checked = True Then msg = msg & "3" & vbNewLine ' process option 3 End If If Len(msg) = 0 Then msg = "(Keine)" MsgBox msg, , "Ausgewählte Optionen" Window.Close End Sub Sub btnCancel_onClick Window.Close End Sub </script> <hta:application> </head>
Die Datei liegt (mit englischen Texten) als multichoice.hta vor. Sie enthält ein paar zusätzliche Anweisungen zur Fenstergestaltung.
Natürlich könnte mittels HTA auch eine Eingabe von Optionsnummern nach den oben gezeigten Verfahren realisiert werden. Die Auswahl über Checkbox-Elemente ist aber für Benutzer sicher intuitiver und hat zudem den großen Vorteil, dass eine komplizierte Auswertung und Fehlerprüfung der Eingabe entfällt.
PowerShell
Mit PowerShell kann eine Benutzereingabe im Konsolenfenster verarbeitet bzw. an Cmd oder eine Befehlsdatei weitergegeben werden. Darüber hinaus lassen sich mithilfe von Klassen des .NET Framework GUI-Dialoge für die Eingabe sowie Listenauswahl einsetzen.
Beispiele hierfür sind in der PowerShell-Dokumentation enthalten, sodass hier nicht weiter darauf eingegangen werden muss (Links: Read-Host, Input box, List box).
Sonstiges
Abschließend sei angemerkt, dass sich Auswahlen auch mit Dialogfenstern von VTOOL realisieren lassen. (Die Bereitstellung solcher GUI-Dialoge war ja eines der Hauptmotive für die Entwicklung von VTool.)
VTool ist allerdings eine Zusatzkomponente. Daher setzt die Verwendung eine vorherige Installation (Objektregistrierung) voraus.
VTool stellt zwei verschiedene Listenfenster bereit, die Mehrfachauswahlen gestatten. Außerdem macht VTool den Taskdialog verfügbar, der die Auswahl einer Option über Radiobuttons erlaubt.
Eine Mehrfachauswahl könnte mit dem CheckList-Objekt eingerichtet werden, zum Beispiel:
optionen = "Option 1" & vbNewLine & "Option 2" & vbNewLine & "Option 3" Set obj = CreateObject("VTool.CheckList") auswahl = obj.Selection(optionen, , "Wählen Sie die gewünschten Optionen")
VTool.CheckList liefert keine Zahlenliste der gewählten Optionen sondern einen Summenwert aus den Zweierpotenzen der Indizes. Die Indizes beginnen hier bei 0, jeder Index ist also um 1 niedriger als die zugehörige Optionsnummer. Das klingt vielleicht kompliziert, ist aber tatsächlich sehr einfach auszuwerten. Wählt ein Benutzer beispielsweise den ersten und dritten Listeneintrag, so gibt die Funktion 5 (20 + 22) zurück. Zur Auswertung prüft man die entsprechenden Werte:
msg = "" If auswahl And 2^0 Then msg = msg & "1" & vbNewLine ' process option 1 End If If auswahl And 2^1 Then msg = msg & "2" & vbNewLine ' process option 2 End If If auswahl And 2^2 Then msg = msg & "3" & vbNewLine ' process option 3 End If If Len(msg) = 0 Then msg = "(Keine)" MsgBox msg, , "Ausgewählte Optionen"
Dieser Beispielcode liegt in der Datei checklist.vbs vor.
Download, Benutzung
Die in diesem Artikel erwähnten Dateien sind in multichoice.zip enthalten. Sie können sie in einen beliebigen Ordner entpacken und nach Ihren Vorstellungen verwenden.
Beachten Sie bitte, dass die Überlassung dieser Dateien ohne jede Gewährleistung oder Haftung erfolgt. Die Benutzung erfolgt auf eigenes Risiko!