Wie kann ich eine Zahl in einer Batch Datei mithilfe der eigenen Batch Datei ändern?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
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

timlg07  02.08.2019, 09:38

z.B. `set /a summonNr -= 1` sollte da eigentlich noch hin. Eine Inline-Codebeispiel-Funktion wäre bei gutefrage.net auch ganz praktisch.

1
Gamer4214 
Fragesteller
 02.08.2019, 09:59
@timlg07

und was muss ich schreiben damit die summonnr am anfang 3 ist, damit sie auch reduziert wird?

0
timlg07  02.08.2019, 13:59
@Gamer4214

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 (...)
0
Gamer4214 
Fragesteller
 02.08.2019, 18:11
@timlg07

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.

0
timlg07  03.08.2019, 10:50
@Gamer4214

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


1

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
)

Erzesel  05.08.2019, 09:22

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
1