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:

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...