Zahl in eine Txt Datei schreiben - Batch
Guten Tag :D Ich habe eine lange komplizierte Frage. Ich schreibe mir eine Batch in welcher ich ein Login einbauen will. Man hat 5 Versuche bis eine aktion(pc herunterfahren was auch immer) ausgeführt wird. Beim Start des Programms sollte es den COUNTER(%counter%) aus der tmp.txt lesen, was soweit auch klappt. Mein Problem ist, dass wenn ich mit dem Befehl... echo %counter%>tmp.txt
...die Variable counter in die Datei schreiben will, schreibt es nicht die ZAHL, sondern den Text... ECHO IST AUSGESCHSALTET (OFF) ...hinein
Wenn das Passwort falsch ist, zählt der COUNTER immer 1 hoch. Ich möchte aber nicht das man einfach das programm beenden kann und neu öffnen und schon ist der counter wieder auf null. Fett gedrucktes macht Probleme HIER MEIN SKRIPT:
@echo off
cls
set /a counter=<temp.txt
:anmeldung
cls
set /p user=Benutzername:
set /p pass=Passwort:
if "%user%"=="root" goto check
if not "%user%"=="root" goto false
:check
if "%pass%"=="superuser" goto start
if not "%pass%"=="superuser" goto false
exit
:false
cls
set /a counter=%counter%+1
echo %counter%>temp.txt
if "%counter%"=="5" goto end
echo Warten Sie 30 Sekunden!
ping localhost -n 30>NUL
goto anmeldung
exit
:start
cls
set /a counter=0
echo Angemeldet USW...
pause
:end
echo 5 mal falsch
pause
exit
Danke Im Voraus für die Hilfe
Lg Piuz
2 Antworten
Hey Piuzdorian, der Fehler bedeutet, dass in der Variable kein Wert eingespeichert ist. Deine Methode eine Datei auzulesen funktioniert leider nicht. Wenn du set /a counter=<temp.txt mit dem folgendem Text austauscht sollte dein Programm gehen:
for /f "delims=" %%i in (DATEI_ZUM_AUSLESEN) do set "NAME_DER_VARIABLE=%%i"
DATEI_ZUM_AUSLESEN = Name der Datei, die du auslesen willst NAME_DER_VARIABLE = Name der Variable in die der Inhalt der Datei geschrieben werden soll
Ich hoffe ich konnte dir helfen ;)
IDerAndiI
Versuch mal nicht if "%counter%"=="5" goto gesperrt sondern ohne die ", also: if %counter%==5 goto gesperrt
Lg IDerAndiI
Gerne ;) Ne, ich bin kein Hacker, ich bin 14 und schreib aus Spaß Batch Dateien. :D
Gruß IDerAndiI
Hey IDerAndiI, danke für deine schnelle antwort👌... Ich werde es gerade testen. Schade ist das das nicht so einfach geht, sondern so einen langen schwierigen befehl braucht :D danke erst mal werde mich nacher wieder melden. Bist doch der beste. Haste hilfreichste antwort
Falsch: set /a counter=<temp.txt
Besser: set /p counter=<temp.txt
Unnötig: if not "%pass%" == "root" goto false
Besser: goto false
Falsch: echo %counter%>temp.txt
Besser: echo %counter% 1>temp.txt
"exit" zwischen einem GOTO-Befehl und einer Marke ist sinnlos.
Beim ">" kann man steuern, welche Art von Ausgabe man übermitteln will. Normalerweise geht das Programm von normaler Ausgabe aus, was "1>" entspricht. Man kann auch Fehlerausgabe angeben, dann benutzt man "2>".
Weil %counter% eine Zahl ist, versucht das Programm daher einen Ausgabentypen zu übergeben (soweit ich weiß ist alles außer 1 und 2 ungültig, wodurch gar nichts übergeben wird), statt die Zahl selbst zu übergeben.
Ist "%counter%" z.B. "3", versucht CMD bei
echo 3>temp.txt
Ausgabentyp 3 in "temp.txt" zu schreiben. Da es Typ 3 nicht gibt, ist die Datei leer.
Bei "echo 1>temp.txt" würde "ECHO ist ausgeschaltet (OFF)." in die Datei geschrieben werden, da das die normale Ausgabe von "echo " ist.
Danke S1r1us13, Das Mit dem EXIT und dem goto direkt weiss ich, mache dass aber immer aus gewohnheit :D
Besser: set /p counter=<temp.txt
das funktioniert irgendwie nicht. ist was am code falsch?
@echo off
cls
set /p counter=<tmp.txt
if "%counter%"=="5" goto gesperrt
:anmeldung
cls
set /p user=Benutzername:
set /p pass=Passwort:
if "%user%"=="root" goto check
goto false
:check
if "%pass%"=="superuser" goto start
goto false
:false
cls
set /p counter=%counter%+1
echo "%counter%">tmp.txt
if "%counter%"=="1" set /a sek=30
if "%counter%"=="2" set /a sek=60
if "%counter%"=="3" set /a sek=90
if "%counter%"=="4" set /a sek=120
if "%counter%"=="5" goto end
Bei folgenden Zeilen würde ich alle Anführungszeichen (") entfernen: 7 ; 17 ; 23 ; 33-43
Zeile 31: Man rechnet mit set /a x=y+z
Folgende Ziele (goto) fehlen: gesperrt / start / end
01: @echo off
02:
03: cls
04:
05: set /p counter=<tmp.txt
06:
07: if "%counter%"=="5" goto gesperrt
08:
09: :anmeldung
10:
11: cls
12:
13: set /p user=Benutzername:
14:
15: set /p pass=Passwort:
16:
17: if "%user%"=="root" goto check
18:
19: goto false
20:
21: :check
22:
23: if "%pass%"=="superuser" goto start
24:
25: goto false
26:
27: :false
28:
29: cls
30:
31: set /p counter=%counter%+1
32:
33: echo "%counter%">tmp.txt
34:
35: if "%counter%"=="1" set /a sek=30
36:
37: if "%counter%"=="2" set /a sek=60
38:
39: if "%counter%"=="3" set /a sek=90
40:
41: if "%counter%"=="4" set /a sek=120
42:
43: if "%counter%"=="5" goto end
Lg IDerAndiI
Sry, hab vergessen zu sagen, dass die Zahlen am Anfang jeder Zeile nur eine Denkhilfe sind, also im Programmcode nicht stehen dürfen, weil sonst das Programm nicht funktioniert ;)
Lg IDerAndiI
Weil du "%counter%" mit Anführungszeichen in tmp.txt schreibst, kommt durch
set /p counter=<tmp.txt
etwas wie "1" mit Anführungszeichen raus. Der darauffolgende IF-Befehl sähe dann so aus:
if ""1""=="5" goto gesperrt
IF wird durch falsche Syntax abstürzen, da zu viele Anführungszeichen genommen wurden. Wenn du die Anführungszeichen im IF-Befehl um %counter% entfernst, dürfte es klappen:
if %counter%=="5" goto gesperrt
Das Problem ist aber, dass du dann nicht +1 rechnen kannst. Daher empfehle ich weiterhin
echo %counter% 1>tmp.txt
Um das Leerzeichen hinter %counter% wegzubekommen, könntest du ganz oben nach dem SET/P-Befehl "set /a counter=%counter%" benutzen.
Beim letzten SET-Befehl musst du übrigens weiterhin /a benutzen: "set /a counter=%counter%+1".
Dann gibts doch noch ne leichte Möglichkeit Dateien auszulesen :) Danke @S1r1us13 , das wusste ich auch noch nicht ;)
Lieber IDerAndiI,
Ich habe jetzt das so gemacht wie du. Das funktioniert sehr gut...Danke. Nun habe ich schon weiter probiert und bin jetzt soweit, dass bei falscher eingabe zählt der counter 1 nach oben und speichert das in tmp.txt. das klappt auch. wenn der SPEICHER(tmp.txt) 5 ist, kommt er in den ABschnitt :gesperrt und dort erscheint: Ist gespert und so...
damit man ja das programm nicht beenden kann und dann ist es entsperrt, habe ich am anfang das gemacht:FETTGEDRUCKTER
also es nimmt am anfang mal zuerst die 5 im tmp.txt in die variable %counter% nacher soll es ja schauenb ob sie 5 ist, wenn ja wieder zum abschnitt gesperrt gehen. wenn nein einfach weiter zum login. aber es überspringt mir diesen befehl einfach... Warun?
@echo off
cls
for /f "delims=" %%i in (tmp.txt) do set "counter=%%i"
if "%counter%"=="5" goto gesperrt
:anmeldung
cls
set /p user=Benutzername:
set /p pass=Passwort:
if "%user%"=="root" goto check
goto false
:check
if "%pass%"=="superuser" goto start
goto false *
Endschuldigung für die vielen Fragen, bin leider eine Pfeife was Cmd angeht :D
Lg Piuzdorian