DOKUMENTATION LESEN UND AKZEPTIEREN VON BENUTZER-EINGABEN in MS-DOS-Batchdateien Windows 2000 und höher kennt in seinem DOS-Bereich den Befehl 'SET/P' als Eingabeverwertung. Die Benutzereingabe kann anschließend als Variable in weiteren Schritten verwendet werden. Für das altes DOS bis Windows 9x muß man jedoch ein Umweg nehmen. Hier wurde eine Modifikation vom bereits in COPYDAT.ZIP verwendeten DOS-SKRIPT aus http://www.ericphelps.com/batch/samples/samples.htm bzw. http://www.ericphelps.com/batch/samples/rootname.bat.txt mit dem gefürchteten, beispielsweise in http://www.robvanderwoude.com/userinput.php beschriebenen 'COPY CON' - Befehl und der 'NUL' - Anweisung kombiniert. Ebenfalls zum Einsatz kommt die CHOICE- Anweisung aus DOS/Windows 9x. In Windows 2000 und höher muß dazu die DOS-Anwendung REPLY.COM o.Ä. eingesetzt und das Skript entsprechend abgeändert werden. NACHTRAG: In Windows 7 (ab Vista) ist CHOICE in der DOS (CMD-) Box wieder verfügbar - allerdings hat sich die Syntax geändert, mit der dieser Befehl angesprochen werden kann, so daß ältere Batch-Dateien mit CHOICE mit einer Fehlermeldung abbrechen. Dabei sind die Änderungen kleinlich: Syntax in Windows 98 (DOS): choice /C:JN " OK? Ja\Nein " Dieselbe Syntax in Windows 7: choice /C JN /M " OK? Ja\Nein " Das eine ist DOS, das andere Windows. Die Syntaxe sind nicht kompatibel. Die folgenden Skripte müssen dementsprechend hier abgewandelt werden. Alternativ dazu kann eine Skript-Weiche eingebaut werden: Siehe http://en.wikipedia.org/wiki/Ver_(command) Findet Windows - Versionen ab Vista: ver | find "6." > nul if not ERRORLEVEL 1 GOTO W7 if ERRORLEVEL 1 GOTO W98 :W98 choice /C:JN " OK? Ja\Nein " Goto Weiter :W7 choice /C JN /M " OK? Ja\Nein " Goto Weiter :Weiter ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ EINZELHEITEN - Es können pro Skript bis zu acht Variablen (%2-%9) eingegeben werden. - Ausgelesen können sowohl bereits vorliegende, wie auch durch Benutzereingabe ad hoc generierte Textdateien. - Hierzu wird mit Hilfe von 'COPY CON' eine Textdatei generiert, die anschließend von einer temporären Batch-Kombination ausgelesen wird. - Die dazu notwendige Batch-Datei 'KN_UMBR1.BAT' sollte nicht verändert werden; und wenn doch, darf sie auf keinen Fall einen Zeilenumbruch enthalten! - Die Dateien '_INHALT.TXT' und '_TEST.TXT' dienen als Demonstrations- Dateien - Das an den 'COPY'- Befehl angefügte '> nul' dient der Unterdrückung der entbehrlichen Meldung "x Datei(en) kopiert". (Diese Anweisung unterdrückt JEDE Meldung in DOS) - 'ECHO.' erzeugt eine Leerzeile und unterdrückt die Fehlermeldung. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ BEISPIELE Die folgenden Batch-Dateien zeigen verschiedenen Möglichkeiten auf, diese Befehlskombinationen einzusetzen. In Eingabe 1 wird die vorliegen Textdatei '_INHALT.TXT' ausgelesen und verwertet. In Eingabe 2 und 3 wird tatsächlich eine Eingabe verwertet. In Eingabe 3 kommt zur Demonstration zusätzlich die Anwendung 'HTPASSWD.EXE' zum Einsatz, welche codierte Paßwörter für Unix-Server generiert (diese können dann mit der Datei .HTACCESS für Benutzer-Webseiten verwendet werden). Mit Hilfe des Skriptes kann sie mit einer Batch-Datei aufgerufen werden, in die der Name und das Paßwort direkt eingegeben werden können. Die folgenden Batch-Dateien sind im Archiv enthalten. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ EINGABE 1 - Liest die Textdatei '_INHALT.TXT' aus und benennt die Textdatei '_TEST.TXT' anhand der gefundenen Zeichenfolgen um. Bitte den folgenden Code kopieren und als .BAT-Datei abspeichern: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ @Echo Off REM Benötigt werden noch die Datei 'kn_umbr1.bat' REM Bestehend aus der Zeile 'Hole ' REM - Ohne Umbruch, aber mit Leerzeichen am Ende! REM Sowie ggf. die delay.com REM VORLAUF REM HOLT _INHALT.TXT copy _INHALT.TXT Inhalt2.txt >nul echo. echo Inhalt der Eingabe-Datei: echo _ REM type Inhalt2.txt sort /R Inhalt2.txt echo. echo - echo Ende Inhalt der Eingabe echo. echo. echo Der Vorlauf ist abgeschlossen echo. PAUSE REM ---- REM VORLAGE Hole var1 zu ZW type kn_umbr1.bat>ZW.bat REM ADDIERT NAMEN zu ZW: REM 1 Variable = 1 Wort. Keine Leerzeichen. REM MAXIMAL : echo set var1=%%1%%2%%3%%4%%5%%6%%7%%8%%9>Hole.bat REM ODER : echo set var1=%%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9>Hole.bat REM So können bis zu 9 Zeilenteile als Variable geholt werden REM - Getrennt oder Zusammengefügt REM Durch SORT Leerzeilen-Eingabefehler abfangen REM /_R bewirkt: Leerzeilen nach unten. REM Alphabetisch sortiert sind die Leerzeilen oben. REM Sonst SORT ohne /_R oder TYPE sort /R Inhalt2.txt>>ZW.bat REM Variablen holen: echo. echo Variablen werden gesetzt echo. echo Anzahl der Variablen: 1 echo. REM Festlegen der gesuchten Variablen echo set var1=%%1>Hole.bat REM Holen derselben call ZW.bat echo 2 echo set var2=%%2>Hole.bat call ZW.bat echo. PAUSE REM PRÜFUNG: REM vor SET entfernen REM set PAUSE echo. echo Erkannte Variablen: echo var1: '%var1%' echo var2: '%var2%' echo. choice /c:jn OK? Ja\Nein if errorlevel 2 goto ENDE echo. echo. REM PAUSE echo. Ausfuehrung REM Eigentlich gehört hier eine FOR-Schleife hin REM Aber man kann mit den Variablen ja unterschiedliches anstellen echo. IF "%var1%"=="" echo. Variable 1 existiert nicht IF "%var1%"=="" GOTO NEXT1 echo. echo. Kopiere _TEST.TXT als var1_%var1%.txt copy _TEST.TXT var1_%var1%.txt >nul echo. :NEXT1 IF "%var2%"=="" echo. Variable 2 existiert nicht IF "%var2%"=="" GOTO NEXT2 echo. echo. Kopiere _TEST.TXT als var1_%var2%.txt copy _TEST.TXT var1_%var2%.txt >nul echo. :NEXT2 echo. PAUSE REM ABSCHLUSS echo. :ENDE echo: echo Ende echo. REM Beseitigt Zwischenergebnisse: del Inhalt2.txt del Hole.bat del ZW.bat PAUSE echo Schliesse in 10 Sekunden delay 10 CLS ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ EINGABE 2 - Liest die Benutzereingabe aus und benennt die Textdatei '_TEST.TXT' anhand der gefundenen Zeichenfolgen um. Bitte den folgenden Code kopieren und als .BAT-Datei abspeichern: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ @Echo Off REM Benötigt werden noch die Datei 'kn_umbr1.bat' REM Bestehend aus der Zeile 'Hole ' REM - Ohne Umbruch, aber mit Leerzeichen am Ende! REM Sowie ggf. die delay.com REM VORLAUF echo. echo Eine Zeile Text eingeben, dann echo F6 druecken echo Enter druecken echo. REM Texteingabe: copy con Name.txt >nul IF NOT EXIST Name.txt GOTO LEER1 copy Name.txt Inhalt2.txt >nul echo. echo Inhalt der Eingabe: echo _ REM type Inhalt2.txt sort /R Inhalt2.txt echo. echo - echo Ende Inhalt der Eingabe echo. echo. echo Der Vorlauf ist abgeschlossen echo. PAUSE REM ---- REM VORLAGE Hole var1 zu ZW type kn_umbr1.bat>ZW.bat REM ADDIERT NAMEN zu ZW: REM 1 Variable = 1 Wort. Keine Leerzeichen. REM MAXIMAL : echo set var1=%%1%%2%%3%%4%%5%%6%%7%%8%%9>Hole.bat REM ODER : echo set var1=%%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9>Hole.bat REM So können bis zu 9 Zeilenteile als Variable geholt werden REM - Getrennt oder Zusammengefügt REM Durch SORT Leerzeilen-Eingabefehler abfangen REM /_R bewirkt: Leerzeilen nach unten. REM Alphabetisch sortiert sind die Leerzeilen oben. REM Sonst SORT ohne /_R oder TYPE sort /R Inhalt2.txt>>ZW.bat REM Variablen holen: echo. echo Variablen werden gesetzt echo. echo Anzahl der Variablen: 1 echo. REM Festlegen der gesuchten Variablen echo set var1=%%1>Hole.bat REM Holen derselben call ZW.bat echo 2 echo set var2=%%2>Hole.bat call ZW.bat echo. PAUSE :LEER1 REM PRÜFUNG: REM vor SET entfernen REM set PAUSE echo. echo Erkannte Variablen: echo var1: '%var1%' echo var2: '%var2%' echo. choice /c:jn OK? Ja\Nein if errorlevel 2 goto ENDE echo. echo. REM PAUSE echo. Ausfuehrung REM Eigentlich gehört hier eine FOR-Schleife hin REM Aber man kann mit den Variablen ja unterschiedliches anstellen echo. IF "%var1%"=="" echo. Variable 1 existiert nicht IF "%var1%"=="" GOTO NEXT1 echo. echo. Kopiere _TEST.TXT als var1_%var1%.txt copy _TEST.TXT var1_%var1%.txt >nul echo. :NEXT1 IF "%var2%"=="" echo. Variable 2 existiert nicht IF "%var2%"=="" GOTO NEXT2 echo. echo. Kopiere _TEST.TXT als var1_%var2%.txt copy _TEST.TXT var1_%var2%.txt >nul echo. :NEXT2 echo. PAUSE REM ABSCHLUSS echo. :ENDE echo: echo Ende echo. REM Beseitigt Zwischenergebnisse: del Name.txt del Inhalt2.txt del Hole.bat del ZW.bat PAUSE echo Schliesse in 10 Sekunden delay 10 CLS ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ EINGABE 3 - Liest die Benutzereingabe aus und gibt sie in die Anwendung 'HTPASSWD.EXE' ein. Bitte den folgenden Code kopieren und als .BAT-Datei abspeichern: ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ @Echo Off REM Benötigt werden noch die Datei 'kn_umbr1.bat' REM Bestehend aus der Zeile 'Hole ' REM - Ohne Umbruch, aber mit Leerzeichen am Ende! REM Sowie ggf. die delay.com REM VORLAUF REM Option: Vorherige Ergebnisse löschen REM Sonst werden die Ergebnisse aneinandergefügt del Passwort.txt echo. echo Passwort Codieren echo. echo Nur einen Namen eingeben, dann echo. echo. F6 druecken echo. Enter druecken echo. echo Eingabe: echo. REM Texteingabe: copy con Name.txt >nul IF NOT EXIST Name.txt GOTO LEER1 copy Name.txt Inhalt2.txt >nul echo. echo Inhalt der Eingabe: echo _ REM type Inhalt2.txt sort /R Inhalt2.txt echo. echo - echo Ende Inhalt der Eingabe echo. echo. echo Der Vorlauf ist abgeschlossen echo. PAUSE REM ---- REM VORLAGE Hole var1 zu ZW type kn_umbr1.bat>ZW.bat REM ADDIERT NAMEN zu ZW: REM 1 Variable = 1 Wort. Keine Leerzeichen. REM MAXIMAL : echo set var1=%%1%%2%%3%%4%%5%%6%%7%%8%%9>Hole.bat REM ODER : echo set var1=%%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9>Hole.bat REM So können bis zu 9 Zeilenteile als Variable geholt werden REM - Getrennt oder Zusammengefügt REM Durch SORT Leerzeilen-Eingabefehler abfangen REM /_R bewirkt: Leerzeilen nach unten. REM Alphabetisch sortiert sind die Leerzeilen oben. REM Sonst SORT ohne /_R oder TYPE sort /R Inhalt2.txt>>ZW.bat REM Variablen holen: echo. echo Variablen werden gesetzt echo. echo Anzahl der Variablen: 1 echo. REM Festlegen der gesuchten Variablen echo set var1=%%1>Hole.bat REM Holen derselben call ZW.bat echo. PAUSE :LEER1 REM PRÜFUNG: REM vor SET entfernen REM set PAUSE echo. echo Erkannte Variablen: echo var1: '%var1%' echo. choice /c:jn OK? Ja\Nein if errorlevel 2 goto ENDE echo. echo. REM PAUSE echo. Ausfuehrung echo. echo Passwort wird codiert und echo in Passwort.txt abgelegt echo. echo Name: %var1% echo. echo DAS PASSWORT MERKEN! echo Es wird nicht registriert. echo Auch eine Nulleingabe wird verarbeitet. echo. PAUSE htpasswd -c Passwort.txt %var1% echo. PAUSE REM ABSCHLUSS echo. :ENDE echo: echo Ende echo. REM Beseitigt Zwischenergebnisse: del Name.txt del Inhalt2.txt del Hole.bat del ZW.bat REM AUSGABE echo Ausgabe in Passwort.txt: echo. type Passwort.txt echo. PAUSE echo Schliesse in 10 Sekunden delay 10 CLS ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Hinrichs 2009