Wie kann ich eine Zahl in einer Batch Datei mithilfe der eigenen Batch Datei ändern?
Man nehme an ich habe 3 Versuche.
Jedes mal wird der versuch um eines verringert. ( set /a %Versuch%-1)
Am Anfang gab es 3 Versuche, sobald die Zahl der Versuche 0 wird, springt es mit goto zu meiner VersuchError-Ausgabe.
Mein Problem: set /a Versuch = 3 wird nie reduziert. D.h. ich schätze ich muss es in eine externe Batch Datei auslagern, denn der Wert wird ja regelmäßig bei jedem Versuch geändert.
call SummonNr.bat
set /a summonNr=3
set /a summonNr-1
if %summonNr% == '0' goto SummonError
Ich bin eigentlich beim Spiel erstellen. Vielleicht könnt ihr mir hier helfen
2 Antworten
set /a %Versuch%-1
gibt dir in der cmd lediglich den Wert Versuch-1 aus, genauso wie:
set /a summonNr-1
Um die Variable auch zu setzen, brauchst du auch noch ein Gleichheitszeichen:
set /a summonNr-=1
(Ist übrigens die Kurzschreibweise für `set /a summonNr = summonNr-1`, bei set/a kannst du die Prozentzeichen weglassen, da alle Buchstabenfolgen als Variablen interpretiert werden. Leerzeichen kannst du bei set/a auch fast beliebig setzen, also z.B.)
Und die Überprüfung auf 0 würde ich auch noch korrigieren. Hierfür gibt es mehrere verschiedene richtige Arten, z.B.:
if %summonNr% equ 0 goto SummonError
oder
if "%summonNr%"=="0" goto SummonError
Das hast du schon korrekt gemacht, deswegen habe ich es nicht mehr aufgeführt. Hier noch mal übersichtlich:
Auf 3 setzen:
set /a summonNr = 3
Um 1 reduzieren:
set /a summonNr -= 1
Auf 0 (oder kleiner) überprüfen:
if %summonNr% leq 0 (...)
Ich habe es so stehen
@echo off
set /a summonNr =3
:start
Echo Was willst du tun?
Echo 1) Beschwoeren?
set /p wahl=
if '%wahl%' == '1' goto Summon
if '%wahl%' neq '*' goto Wrong
:Summon
set /a %summonNr%-1
if "%summonNr%" == "0" goto SummonError
:SummonError
Echo Du kannst nicht weiter ....
goto start
:Wrong
Echo Falsche Eingabe
goto start
-----------
So ungefähr sieht das bei mir aus mit mehreren Befehlen.
Das Problem ist nur das die SummonNr nicht in der Textdatei reduziert wird. Wenn ich sie aber ganz oben stehen hab, wird sie nicht jedes mal auf 3 gesetzt sondern nur am Anfang. Es wird aber weder in der Textdatei die Zahl 3 reduziert, noch habe ich beim beschwören max 3 Versuche wenn ich die batch datei gestartet habe.
Natürlich wird die summonNr nicht reduziert, wenn du deinen Code nicht anpasst und immer noch den gleichen Fehler machst wie zu Beginn.
Um die Variable auch zu setzen, brauchst du auch noch ein Gleichheitszeichen
Deswegen hab ich Dir jetzt mal alles in Deinen Code eingearbeitet und noch ein paar Beispiele zum weiteren Vorgehen hinzugefügt:
echo off
:init
cls
set /a summonNr = 3
:start
Echo Was willst du tun?
Echo 1) Beschwoeren
:: Hier einfach noch irgendwas anderes zur Auswahl, sonst macht ein Auswahlmenü ja keinen Sinn.
echo 2) Aufgeben
:: Für solche Auswahlmenüs benutze am besten `choice`
choice /C 12
if %errorlevel% equ 1 goto Summon
if %errorlevel% equ 2 goto Surrender
:Summon
:: Abfrage am Beginn: Beschwörungsversuche werden benötigt um die Funktion auszuführen
:: Erst danach wird der Zähler um eins verringert, sodass man 3 Versuche hat.
if %summonNr% leq 0 goto SummonError
set /a summonNr -= 1
:: hier fehlte noch ein "else" (was soll passieren, wenn die summonNr noch nicht 0 ist?)
echo erfolgreich beschwoert. (Noch %summonNr% Beschwoerungen verbleibend.)
echo.
goto start
:SummonError
Echo Du kannst nicht weiter ....
echo.
goto start
:Surrender
echo Du hast aufgegeben.
choice /M "Neu starten"
if %errorlevel% equ 1 goto init
exit
Wenn du einen Spielstand speichern und wieder auslesen willst, kannst du das mit
echo [wert1] > dateiname
und danach mit
echo [wert2] >> dateiname
etc. tun.
Auslesen:
setlocal enabledelayedexpansion
set /a counter=0
for /f %%A in (dateiname) do (
set /a counter=!counter!+1
set wert!counter!=%%A
)
es geht noch eleganter...
man muss nicht jede Variable einzeln mit echo in die Datei ausgeben.
set "gleicherNamensbeginn" >datei Speichert alle betreffenden Variablen in einem Rutsch.
...und zurück geht's es auch ohne Counter und verzögerte Expansion...
set "wert[1]=5"
set "wert[2]=7"
rem usw....
set "wert[25]=66"
rem speichern aller Variablen wert... in eine Datei auf einen Rutsch!
set "wert[">"test.cfg"
rem alle variablen wert testweise löschen.
for /l %%n in (1,1,30) do (set "wert[%%n]=")
rem sind die Variablen wirklich weg?
set "Wert["
rem alle Variablen aus test.cfg zurückholen
rem ein zähler ist unnötig, es wird jede in der cfg gespeicherte Variable=setting eingelesen und initialisiert.
for /f "usebackq tokens=*" %%a in ("test.cfg") do ( set "%%~a" )
set "wert["
pause
z.B. `set /a summonNr -= 1` sollte da eigentlich noch hin. Eine Inline-Codebeispiel-Funktion wäre bei gutefrage.net auch ganz praktisch.