133. Weihnachtsspezial 2012 ein simpler Vokabeltrainer

Einleitung

Einen Vokabeltrainer aus VBS und Batch zu erstellen gehört eher zu den simplen Aufgaben für uns Low-Level-Programmierer. Der Sternenhimmelstuermer achtete mehr darauf, dass es für den normalen Benutzer so einfach wie möglich ist.

Der Vokabeltrainer arbeitet nach dem Karteikartenprinzip. Eine Datei mit Übersetzung und einem Leerzeichen als Separator müssen Sie selbst erstellen (vokabel.txt - Name ist Pflicht und Fremdwort in der linken Spalte und Übersetzung in die rechte Spalte in jeweils eine Zeile). Die wird dann in einen leeren Ordner zusammen mit der vokabel.bat gelegt und die vokabel.bat mit Doppelklick gestartet - der Rest läuft automatisch). Die Original Vokabeldatei wird nicht verändert.

Das Kommandozeilenfenster wird nach Erstellung der Karteikarten ausgeblendet. Es werden also nur die Fenster im Windows-Style angezeigt:

Grafikoberfläche des Vokabeltrainers



Die Benutzerfläche eher spartanisch - ein einfaches sogenanntes Input-Fenster, wo der User eine Vokabelübersetzung eingibt. Die wird dann abgeglichen und bei Falscheingabe gibt es dann eine Fehlermeldung mit der richtigen Übersetzung. Die Fehlermeldung beinhaltet das Wort mit der richtigen Übersetzung und wird nach 8 Sekunden ausgeblendet oder durch Betätigen der OK-Taste geschlossen. Danach wird das nächste Wort abgefragt.

Bei einer richtigen Übersetzung wird das nächste Wort sofort abgefragt. Die Vokabeln werden nach dem Zufallsprinzip abgefragt, bis es keine Vokabel mehr gibt, die nicht einmalig abgefragt wurde.

Erst dann wird das Endergebnis angezeigt. Im selben Ordner finden Sie nun noch eine Datei mit dem Namen Lerne.txt. Da stehen dann alle Vokabeln mit korrekter Übersetzung drin, die Sie zuvor noch nicht gewusst haben.

Sie sollten nicht mehr als 50 Wörter nehmen. Theoretisch ist es egal, aber das System der Zufallsziehung des Sternenhimmelstuermers ist auf kleine Mengen an Vokabeln ausgelegt.

Sie können das Spiel jederzeit unterbrechen, in dem Sie das Wort exit eingeben. Das steht auch blau umrandet als "Vorauswahl" im Input-Feld. Einfach irgendwo auf das o. a. Fenster mit Mauszeiger drücken und danach die Eingabetaste drücken. Um das Spiel fortzusetzen, betätigen Sie dann die start.vbs. Das Spiel wird dann auch nach Unterbrechung und Ausschalten des Computers gespeichert.

Dieses Notaus ist dem Umstand geschuldet, dass am Arbeitsplatz vielleicht es mal nötig wird, das Spiel schnell zu beenden

Trouble-Shooting: Die Fenster sind erstmal nicht aktiviert und liegen dann hinter anderen geöffneten Fenstern. Optimal ist, wenn Sie andere Anwendungen oder Ordner schließen.
Außerdem wird unter Garantie ein anderes geöffnetes Kommandozeilenfenster geschlossen. Das ist in der Regel beim Ottonormalverbraucher nicht der Fall.

Nachdem langen Intro können Sie entscheiden, ob dieser Vokabeltrainer für Sie das Richtige ist - hey, der ist im Prinzip mega einfach und bietet alles, was ein Profiprogramm bietet!

Inhaltsangabe
Installation
Funktionsweise
Kurzes Überfliegen des Codes für Amateure
Fazit



Installation

Sie brauchen zwei Dateien: vokabel.txt und vokabel.bat in einem beliebigen möglichst leeren Dateiordner.

Was in der vokabel.txt steht und später abgefragt wird, entscheiden Sie. Es ist die Datenbank. Mal zur Probe eine Datenbank:

Inhalt der vokabel.txt:

I ich
like mag
much viel
door Tür

Ja, jede blaue Zeile besteht aus zwei Wörtern mit einem Leerzeichen dazwischen. Sie können Großschreibung, ü, ä...verwenden.

Vorsicht: Es ist nur jeweils ein Wort pro Zeile für die Abfrage und Übersetzung gestattet und die Rechtschreibung im Vergleich muss zu 100 % übereinstimmen! I ist ich und nicht  i ist Ich


....

Die Vokabeln können Sie auch gerne per Copy und Paste von Excel importieren. Leerzeichen werden dann automatisch gesetzt...

.....

Die zweite Datei heißt vokabel.bat.

Als erstes Erstellen Sie eine leere Textdatei, um daraus die Batchdatei zu erstellen: Rechte Maustaste auf Desktop, aus dem Kontextmenü Neu - Textdokument. Dann die Datei mit  Namen benennen:  vokabel.bat . Wichtig ist die Dateiendung *.bat. Der Name ist Pflicht.

Wird ihnen die Dateiendung nicht angezeigt, so müssen Sie zuvor das Anzeigen von Dateiendungen auch bei bekannten Dateiendungen in einem beliebigen Ordner einstellen: Extras - Ordneroptionen - Registerkarte: Ansicht. Dann Häkchen bei  Erweiterungen bei bekannten Dateiendungen ausblenden entfernen. Sollte auch die Menüleiste mit Extras nicht angezeigt werden, so in das Dropdownmenü von Organisieren - Layout und Menüleiste anzeigen.

Dann legen Sie ein Textdokument an und kopieren folgenden blauen Inhalt per Copy und Paste:

if exist start.vbs goto anfang
set destination=%~dp0%
for %%I in (.) do echo %%~sI\vokabel.bat  >zyx.txt
set /p vokpfad=<zyx.txt
>"%destination%start.vbs"  ECHO Set WshShell = WScript.CreateObject("WScript.Shell")
>>"%destination%start.vbs"  ECHO Return = WshShell.Run("%vokpfad%", 0, True)
>>"%destination%start.vbs"  ECHO Set WshShell = Nothing
start "" "start.vbs"
del zyx.txt
exit
:anfang
if exist Zahl.txt goto Schleife
FOR /F "delims=:" %%A IN ('findstr /N .* "vokabel.txt"') DO echo %%A >Zahl.txt
set destination=%~dp0%
FOR /F "tokens=*" %%A IN ('findstr /N .* "vokabel.txt"') DO echo %%A>>vokabel.log
FOR /F "tokens=1,2* delims=: "  %%i  IN (vokabel.log) DO echo %%j %%k>Vokabel_%%i.log
del vokabel.log
:Schleife
set /p anz=<Zahl.txt
if not exist vokabel_*.log goto spielende
 SET MIN=1
 SET MAX=%anz%
 SET /a Zufallszahl=MIN+(MAX-MIN+1)*%random%/32768
if exist vokabel_%Zufallszahl%.log (goto ende) else goto Schleife
:ende
chcp 28591 > NUL
FOR /F "tokens=1,2* delims= "  %%i  IN (vokabel_%Zufallszahl%.log) DO echo %%i>abfrage.log
chcp 28591 > NUL
FOR /F "tokens=1,2* delims= "  %%i  IN (vokabel_%Zufallszahl%.log) DO echo %%j>antwort.log
set /p abfrage=<abfrage.log
set /p antwort=<antwort.log
>"%destination%frage.vbs"  ECHO ZielDatei = "ueb.txt"
>>"%destination%frage.vbs"  ECHO username=InputBox ("Was heißt %abfrage% übersetzt:","Input","exit")
>>"%destination%frage.vbs"  ECHO Dim strText1, strText2
>>"%destination%frage.vbs"  ECHO  strText1 = username
>>"%destination%frage.vbs"  ECHO strText2 = "%antwort%"
>>"%destination%frage.vbs"  ECHO If strText1 = strText2 Then
>>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "1"
>>"%destination%frage.vbs"  ECHO Else
>>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "0"
>>"%destination%frage.vbs"  ECHO End if
>>"%destination%frage.vbs"  ECHO If strText1 = "exit" Then
>>"%destination%frage.vbs"  ECHO set oShell = CreateObject("WScript.Shell")
>>"%destination%frage.vbs"  ECHO Set oWmg = GetObject("winmgmts:")
>>"%destination%frage.vbs"  ECHO strWndprs = "select * from Win32_Process where name='cmd.exe'"
>>"%destination%frage.vbs"  ECHO Set objQResult = oWmg.Execquery(strWndprs)
>>"%destination%frage.vbs"  ECHO For Each objProcess In objQResult
>>"%destination%frage.vbs"  ECHO intReturn = objProcess.Terminate(1)
>>"%destination%frage.vbs"  ECHO Next
>>"%destination%frage.vbs"  ECHO End if
start /wait frage.vbs
chcp 28591 > NUL
 FOR /F "tokens=1"  %%i  IN (ueb.txt) DO echo %%i >neu.txt
set /p vergleich=<neu.txt
set /p original=<antwort.log
chcp 28591 > NUL
if %vergleich% neq 1 echo %abfrage% %original%>>ergebnis_falsch.txt
if %vergleich% neq 1 del vokabel_%Zufallszahl%.log
if %vergleich% neq 1 goto fehlermeldung

if %vergleich% geq 1 echo %abfrage% %original% >>ergebnis_richtig.txt
if %vergleich% geq 1 del vokabel_%Zufallszahl%.log
del abfrage.log
del antwort.log
del neu.txt
del ueb.txt
goto Schleife

:fehlermeldung
>"%destination%meldung.vbs" Echo Set Shell = CreateObject("WScript.Shell")
>>"%destination%meldung.vbs" Echo Shell.Popup "Falsch %abfrage% ist immer noch %original%", 8, "Fehlermeldung", vbOKOnly + vbCritical
start /wait meldung.vbs
del meldung.vbs
goto Schleife
:spielende

FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis_falsch.txt"') DO echo %%A >ergfls.txt
FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis_richtig.txt"') DO echo %%A >ergrtg.txt

if not exist ergebnis_falsch.txt echo 0 >ergfls.txt
if not exist ergebnis_richtig.txt echo 0 >ergrtg.txt
set /p falsche=<ergfls.txt
set /p richtige=<ergrtg.txt
>"%destination%ergebnis.vbs" Echo MsgBox "%richtige% richtige und %falsche% falsche Antworten"
start /wait ergebnis.vbs
del ergebnis_richtig.txt
del ergfls.txt
del ergrtg.txt
del Zahl.txt
del start.vbs
del frage.vbs
if exist abfrage.log del abfrage.log
if exist antwort.log del antwort.log
if exist neu.txt del neu.txt
if exist ueb.txt del ueb.txt
copy ergebnis_falsch.txt lerne.txt
del ergebnis_falsch.txt
exit


Danach schließen Sie das Textdokument und benennen es um in vokabel.bat (Textfeld von Dokumentenüberschrift zweimal längere Zeit mit linker Maustaste andrücken).

Dann Datei Doppelklicken und los geht es.




Funktionsweise


Es werden einzelne Textdokument mit Karteikarten erstellt (Inhalt: ein Wort und Übersetzung). Die Karteikarten werden nach dem Zufallsprinzip aufgerufen. Stimmt  Ihr Eingabewort mit dem Abfragewort überein, so wird die Karteikarte vernichtet und ein Punkt vergeben.

Stimmt die Antwort nicht überein, dann wird ein Negativpunkt vergeben und eine Fehlermeldung ausgegeben, die 8 Sekunden eingeblendet wird. So sehen Sie, wie die Antwort lauten müsste. Die Fehlermeldung können Sie optional mit der OK-Taste wegblenden.

Die Karteikarte wird zerstört, aber die Vokabel später in einen lern.txt mit Übersetzung geschrieben.

Sobald alle Karteikarten zerstört sind, kommt die Endauswertung.

Sie können das Spiel jederzeit abbrechen. Dazu müssen Sie nur die Eingabetaste bei aktivierten Eingabefenster drücken. Denn als Vorauswahl im Input-Feld steht exit.

Für die Fortsetzung des Spiels sollten Sie dann die start.vbs benutzen, die nun im Ordner liegt! Sie können auch die Vokabel.bat betätigen, haben dann aber immer ein geöffnetes Kommandozeilenfenster als Begleitung. Macht nichts - einfach exit eingeben und wieder die start.vbs betätigen...





Kurzes Überfliegen des Codes für Amateure


Ist eine Chimäre aus VBS und cmd, also für Könner beider Sprachen eine Herausforderung...

if exist start.vbs goto anfang
set destination=%~dp0%
for %%I in (.) do echo %%~sI\vokabel.bat  >zyx.txt
set /p vokpfad=<zyx.txt
>"%destination%start.vbs"  ECHO Set WshShell = WScript.CreateObject("WScript.Shell")
>>"%destination%start.vbs"  ECHO Return = WshShell.Run("%vokpfad%", 0, True)
>>"%destination%start.vbs"  ECHO Set WshShell = Nothing
start "" "start.vbs"
del zyx.txt
exit
:anfang

Erste Block wird die cmd sichtbar ausgeführt. Das will ich ändern.  Die erste Zeile ist wichtig, weil in den folgenden Zeilen nun folgendes passiert:

Der Standort wird ermittelt ( set destination=%~dp0%) und der Pfad von der Vokabel.bat ( for %%I in (.) do echo %%~sI\vokabel.bat  >zyx.txt) auf DOS-Ebene.

Der Pfad wird  in einem Textdokument  ( set /p vokpfad=<zyx.txt) gespeichert und zur Variablen ( set /p vokpfad=<zyx.txt).

Dann wird ein VBS erstellt:

>"%destination%start.vbs"  ECHO Set WshShell = WScript.CreateObject("WScript.Shell")
>>"%destination%start.vbs"  ECHO Return = WshShell.Run("%vokpfad%", 0, True)
>>"%destination%start.vbs"  ECHO Set WshShell = Nothing

Die Batch startet  das VBS ( start "" "start.vbs") und die VBS im Gegenzug wieder die Batch in einer neuen Instanz (nichts anderes sagen die drei Zeilen des VB-Scripts).

Die alte Instanz der Batch wird geschlossen ( exit), während die neue Instanz  der Vokabel.bat in der ersten Zeile ( if exist start.vbs goto anfang) nun auf den Sprungpunkt ( :anfang) umgeleitet wird, weil ja nun unzweifelhaft eine start.vbs vorliegt.

Das ganze Theater nur, weil wir eine unsichtbare cmd haben wollen...


Der zweite Block ist dann wieder leichter zu verstehen:

if exist Zahl.txt goto Schleife
FOR /F "delims=:" %%A IN ('findstr /N .* "vokabel.txt"') DO echo %%A >Zahl.txt
set destination=%~dp0%
FOR /F "tokens=*" %%A IN ('findstr /N .* "vokabel.txt"') DO echo %%A>>vokabel.log
FOR /F "tokens=1,2* delims=: "  %%i  IN (vokabel.log) DO echo %%j %%k>Vokabel_%%i.log
del vokabel.log


Die erste Zeile ( if exist Zahl.txt goto Schleife) ist wiederum nur interessant, wenn das Spiel  zwischenzeitlich abgebrochen wurde und noch keine Karteikarten erstellt wurden.

Erstmal wird die Zeilenzahl im Vokabel.txt ermittelt und in einem Textdokument gesichert ( FOR /F "delims=:" %%A IN ('findstr /N .* "vokabel.txt"') DO echo %%A >Zahl.txt).
Dann wird ein mit den Zeilen durchnummeriertes Vokabel.log ( FOR /F "tokens=*" %%A IN ('findstr /N .* "vokabel.txt"') DO echo %%A>>vokabel.log) geschaffen - das sieht dann z. B. so aus:

1:I ich
2:like mag
3:much viel
4: door Tür

Das wird nun in einzelne Karteikarten zerlegt ( FOR /F "tokens=1,2* delims=: "  %%i  IN (vokabel.log) DO echo %%j %%k>Vokabel_%%i.log).

Also steht jetzt z. B. im Vokabel_1.log I Ich, Vokabel_2.log like mag...

Damit sind die Karteikarten erstellt und es geht nun darum, eine Auswahl einer Karteikarte per Zufall zu erstellen:

:Schleife
set /p anz=<Zahl.txt
if not exist vokabel_*.log goto spielende
 SET MIN=1
 SET MAX=%anz%
 SET /a Zufallszahl=MIN+(MAX-MIN+1)*%random%/32768
if exist vokabel_%Zufallszahl%.log (goto ende) else goto Schleife
:ende

Wenn es keine Karteikarte mehr gibt, dann geht es zum Spielende ( if not exist vokabel_*.log goto spielende), ansonsten wird nun eine Zufallszahl zwische 1 und der maximalen ( set /p anz=<Zahl.txt) Anzahl (SET /a Zufallszahl=MIN+(MAX-MIN+1)*%random%/32768)  der Karteikarten erstellt. Im Textdokument Zahl.txt stand  die höchste Zahl  der Karteikarten.

Wenn jetzt eine Karteikarte nach dem Muster  vokabel_%Zufallszahl%.log ( if exist vokabel_%Zufallszahl%.log (goto ende) else goto Schleife), dann wird die Karteikarte gezogen, um mit ihr zu spielen, gibt es keine  vokabel_%Zufallszahl%.log, dann wird eine neue Zufallszahl gezogen. *  steht für eine Zah, die auch durchaus 10 sein kann.

chcp 28591 > NUL
FOR /F "tokens=1,2* delims= "  %%i  IN (vokabel_%Zufallszahl%.log) DO echo %%i>abfrage.log
chcp 28591 > NUL
FOR /F "tokens=1,2* delims= "  %%i  IN (vokabel_%Zufallszahl%.log) DO echo %%j>antwort.log
set /p abfrage=<abfrage.log
set /p antwort=<antwort.log

Ich nehme nun die Karteikarte, die gerade gezogen wurde (vokabel_%Zufallszahl%.log) und  zerlege Sie in ihre Einzelteile. Nehmen wir mal an, eine 1 ist die Zufallszahl. Wir wissen aus dem vorherigen Block, dass ein vokabel_1.log existiert. Also steht da nach obigen Beispiel i ich drin.

Also würde im abfrage.log ( FOR /F "tokens=1,2* delims= "  %%i  IN (vokabel_%Zufallszahl%.log) DO echo %%i>abfrage.log) i drinstehen und im antwort.log ( FOR /F "tokens=1,2* delims= "  %%i  IN (vokabel_%Zufallszahl%.log) DO echo %%j>antwort.log) die Übersetzung ich.

Die werden dann die Variablen abfrage ( set /p abfrage=<abfrage.log) und antwort ( set /p antwort=<antwort.log).


>"%destination%frage.vbs"  ECHO ZielDatei = "ueb.txt"
>>"%destination%frage.vbs"  ECHO username=InputBox ("Was heißt %abfrage% übersetzt:","Input","exit")
>>"%destination%frage.vbs"  ECHO Dim strText1, strText2
>>"%destination%frage.vbs"  ECHO  strText1 = username
>>"%destination%frage.vbs"  ECHO strText2 = "%antwort%"
>>"%destination%frage.vbs"  ECHO If strText1 = strText2 Then
>>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "1"
>>"%destination%frage.vbs"  ECHO Else
>>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "0"
>>"%destination%frage.vbs"  ECHO End if
>>"%destination%frage.vbs"  ECHO If strText1 = "exit" Then
>>"%destination%frage.vbs"  ECHO set oShell = CreateObject("WScript.Shell")
>>"%destination%frage.vbs"  ECHO Set oWmg = GetObject("winmgmts:")
>>"%destination%frage.vbs"  ECHO strWndprs = "select * from Win32_Process where name='cmd.exe'"
>>"%destination%frage.vbs"  ECHO Set objQResult = oWmg.Execquery(strWndprs)
>>"%destination%frage.vbs"  ECHO For Each objProcess In objQResult
>>"%destination%frage.vbs"  ECHO intReturn = objProcess.Terminate(1)
>>"%destination%frage.vbs"  ECHO Next
>>"%destination%frage.vbs"  ECHO End if
start /wait frage.vbs

Nachdem die Vorbereitungen getroffen sind, wird nun ein frage.vbs erstellt und gestartet ( start /wait frage.vbs) , in dem der User eine Frage mit dem Inputfeld erhält ( >>"%destination%frage.vbs"  ECHO username=InputBox ("Was heißt %abfrage% übersetzt:","Input","exit")

Zur Erklärung die cmd schreibt Zeile für Zeile das VBS - was nach Echo kommt ist Skriptinhalt. %abfrage% ist dabei lediglich unsere Variable in der cmd, die bei der Ausgabe in das VB-Skript durch den Inhalt der Variable ersetz wir, also steht im VBS: username=InputBox ("Was heißt I übersetzt:","Input","exit")
"exit" ist das eingetragene Wort in dem Inputfeld

Dim strText1, strText2
strText1 = username
strText2 = "ich"

Im VBS gibt es also zwei Variablen. Diesmal steht im Klartext in dem VBS das übergebene Wort aus der Variablen %antwort% aus der Batch: z. B. ich.

If strText1 = strText2 Then
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "1"

Wenn also die Eingabe aus dem Inputfeld durch den Benutzer (strText1 = username) ich ist, dann ist Sie gleich mit  der strText2 = "ich".
Dann wird eine 1 in das Dokument (ZielDatei,) eingetragen(CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "1").
ZielDatei ist wiederum die Variable des VBS für ueb.txt (ZielDatei = "ueb.txt" ).

Else
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine "0"
End if

Ansonsten, wenn die Eingabe nicht übereinstimmt, dann wird eine 0 in die ueb.txt geschrieben.

If strText1 = "exit" Then...........End if

Wenn das Wörtchen exit eingetragen wird, dann wird die ganze cmd geschlossen. Das Skript gibt es hier.

Sie sehen, im Prinzip findet der ganze Vergleich im VBS statt und nach dem Schließen haben wir ein ueb.txt mit einer 0 oder 1. Vorteil dieser Methode ist es, dass wir keine Probleme mit ä,ü, Großschreibung usw. haben.

chcp 28591 > NUL
 FOR /F "tokens=1"  %%i  IN (ueb.txt) DO echo %%i >neu.txt
set /p vergleich=<neu.txt
set /p original=<antwort.log
chcp 28591 > NUL
if %vergleich% neq 1 echo %abfrage% %original%>>ergebnis_falsch.txt
if %vergleich% neq 1 del vokabel_%Zufallszahl%.log
if %vergleich% neq 1 goto fehlermeldung

if %vergleich% geq 1 echo %abfrage% %original% >>ergebnis_richtig.txt 
if %vergleich% geq 1 del vokabel_%Zufallszahl%.log
del abfrage.log
del antwort.log
del neu.txt
del ueb.txt
goto Schleife

Wichtig im nächsten Block sind die Vergleiche. Ist die Vokabel falsch (neq 1), also wurde vom VBS in den ueb.txt eine Null geschrieben, so werden drei Aktionen von der cmd ausgeführt:

1. Es wird das Wort mit Übersetzung in ein Dokument geschrieben if %vergleich% neq 1 echo %abfrage% %original%>>ergebnis_falsch.txt
2. Die Karteikarte wird zerstört if %vergleich% neq 1 del vokabel_%Zufallszahl%.log
3. Es wird zum Sprungpunkt Fehlermeldung verwiesen if %vergleich% neq 1 goto fehlermeldung

Ist die Vokabel richtig ( if %vergleich% geq 1)  Aktionen:
1. Die Vokabeln werden in ein Textdokument geschrieben ( if %vergleich% geq 1 echo %abfrage% %original% >>ergebnis_richtig.txt  )
2. Die Karteikarte wird gelöscht ( if %vergleich% geq 1 del vokabel_%Zufallszahl%.log)

Ist die Vokabel richtig, dann geht es auf jeden Fall zur Schleife zurück ( goto Schleife). Wenn es keine weiteren Vokabeln mehr gibt, dann greift dort sofort der Satz: if not exist vokabel_*.log goto spielende

Wir sind aber gerade dabei herauszufinden, was passiert, wenn ein falsches Wort eingegeben wurde, dass zu einer 0 wurde und demnach ungleich 1 ist oder eben in der Zeile  if %vergleich% neq 1 goto fehlermeldung

:fehlermeldung
>"%destination%meldung.vbs" Echo Set Shell = CreateObject("WScript.Shell")
>>"%destination%meldung.vbs" Echo Shell.Popup "Falsch %abfrage% ist immer noch %original%", 8, "Fehlermeldung", vbOKOnly + vbCritical
start /wait meldung.vbs
del meldung.vbs
goto Schleife

Aha, in den nächsten Zeilen unter Fehlermeldung wird wieder ein VBS Namens meldung.vbs erstellt und ausgeführt, während die batch wartet ( start /wait meldung.vbs) .

Set Shell = CreateObject("WScript.Shell")
 Shell.Popup "Falsch I ist immer noch Ich", 8, "Fehlermeldung", vbOKOnly + vbCritical

Diesmal also das Popup für eine Fehlermeldung. Das dauert 8 Sekunden. Das VBS bekommt wieder den Klartext, der in der cmd noch die Variablen %abfrage% und %original% sind. Ist also eine maßgeschneiderte Lösung.

Auch in diesem Fall geht es danach wieder zurück zur Schleife ( goto Schleife). Wenn es keine weiteren Vokabeln mehr gibt, dann greift dort sofort der Satz: if not exist vokabel_*.log goto spielende

:spielende

FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis_falsch.txt"') DO echo %%A >ergfls.txt
FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis_richtig.txt"') DO echo %%A >ergrtg.txt

if not exist ergebnis_falsch.txt echo 0 >ergfls.txt
if not exist ergebnis_richtig.txt echo 0 >ergrtg.txt
set /p falsche=<ergfls.txt
set /p richtige=<ergrtg.txt
>"%destination%ergebnis.vbs" Echo MsgBox "%richtige% richtige und %falsche% falsche Antworten"
start /wait ergebnis.vbs
del ergebnis_richtig.txt
del ergfls.txt
del ergrtg.txt
del Zahl.txt
del start.vbs
del frage.vbs
if exist abfrage.log del abfrage.log
if exist antwort.log del antwort.log
if exist neu.txt del neu.txt
if exist ueb.txt del ueb.txt
copy ergebnis_falsch.txt lerne.txt
del ergebnis_falsch.txt
exit

Alle Karten wurden gezogen und nun muss das Spiel ausgewertet und angezeigt werden. Nach jeder Abfrage wurden die Ergebnisse in jeweils ein Dokument geschrieben (ergebnis_falsch.txt oder ergebnis_richtig.txt).

Was liegt nun näher als die Zeilen in diesen beiden Dokumenten auszuzählen ( FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis_falsch.txt"') DO echo %%A >ergfls.txt
FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis_richtig.txt"') DO echo %%A >ergrtg.txt) ?

Dann muss noch berücksichtigt werden, das bei einem Durchlauf alle Ergebnisse richtig oder falsch sind:

if not exist ergebnis_falsch.txt echo 0 >ergfls.txt
if not exist ergebnis_richtig.txt echo 0 >ergrtg.txt

In diesem Fall greift eine der o. a.  For-Schleife ins leere, was nichts ausmacht, da die Fehlermeldung bei ausgeblendeter Batch ins leere läuft. Wenn es also nicht ein Dokument mit falschen oder richtigen Dokumenten gibt, so wird eine 0 in das entsprechende Dokument eingetragen.

Dann wird noch ein letztes mal ein vbs mit einer msgbox erstellt und ausgeführt;

>"%destination%ergebnis.vbs" Echo MsgBox "%richtige% richtige und %falsche% falsche Antworten"
start /wait ergebnis.vbs

Der Weg der Variablen wurde schon zwei Mal erklärt. Ein drittes mal ist nicht mehr nötig, dass sollte jetzt gehen.

Dann werden die falschen Antworten noch mal schnell in einen lerne.txt kopiert, aber diesmal sind es natürlich die richtigen Wörter copy ergebnis_falsch.txt lerne.txt

Dann wird noch ein wenig entmüllt...

Es darf sich ruhig auch jemand mal dafür bedanken, dass der Sternenhimmelstuermer seit drei Windows- Generationen bemüht ist, schwierige Batches weitestgehend zu erklären. Gibt es sonst nicht so im Internet...

Fazit

Erklärung dauerte wieder mal fast so lange wie die Erstellung dieser kleinen Batch. Der Sternenhimmelstuermer wünscht viel Spass beim Trainieren von Vokabeln...

Vielleicht interesiiert Sie auch
- eine Dektopsuchmaschine mit Archivierungsfunktion
- Festplattenspeicherfresser mit Batch finden
- Lottozahlengenerator in VBS und Batch
- Grundlagenabhandlungen zur künstlichen Intelligenz KI I, KI II und Ki III
- eine Ernährungstabelle ernaehrungstabelle.html in Excel ohne Makros

Ansonsten um die 130 Abhandlungen im W7 Bereich...


Impressum
Datenschutz