budders
Goto Top

(Batch) Einzelne Zeile auslesen?

Ich bin gerade dabei eine Art Tamagochi in Batch zu programmieren und habe ein Problem im "Shop"

Guten Tag,
ich habe gestern begonnen einen Tamagochi in Batch zu programmieren.
Nun möchte ich für den Shop Bereich die Preise aus einer Datei auslesen, es ist jeweils nur eine Zahl pro Zeile in der entsprechenden Datei.
Ich habe bereits Biber's LineToVar gefunden, doch damit habe ich das Problem, dass es eigene Sprungmarken verwendet..
Wenn es eine Möglichkeit gibt zur zuletzt verwendeten Sprungmarke zurück zu springen wäre das natürlich großartig und das Problem wäre gelöst.
Hier ist mal ein Teil des Codes.
echo Was moechtest du kaufen?
echo =======================
echo 1) Schokolade (1 Hunger)
echo 2) Backkartoffel (5 Hunger)
echo 3) Allyoucaneat (10 Hunger)
echo Du hast %money% Geld
set /p choice3=

if "%choice3%"=="1" (  

Hier muss irgendwie die Zeile 1 aus der Datei "price" ausgelsen und in die Variable %price% geschrieben werden..  

if %money% LSS %price% goto fail
set /a money=%money% - %price%
ping -n 2 127.0.0.1 > NUL
echo Kauf erfogreich
goto shop
)

Wenn jemand eine Lösung für das Problem hat, so wie ich es mir gedacht habe oder anders (solang es funktioniert ist mir egal WIE es gelöst wird ^^ ) wäre ich demjenigen sehr dankbar face-smile

Vielen Dank schonmal jetzt.
MfG Budders

Content-ID: 205327

Url: https://administrator.de/contentid/205327

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

rubberman
rubberman 20.04.2013 um 11:43:13 Uhr
Goto Top
Hallo Budders, willkommen im Forum.

Mal was zum Testen. In price.txt befinden sich die Zeilen
4
8
10

Der Batchcode:
@echo off &setlocal
set /a "money=8"  

echo Was moechtest du kaufen?
echo =======================
echo 1) Schokolade (1 Hunger)
echo 2) Backkartoffel (5 Hunger)
echo 3) Allyoucaneat (10 Hunger)
echo Du hast %money% Geld
set /p choice3=

call :getPrice "price.txt" "%choice3%" price  

if %money% LSS %price% (
  call :fail
) else (
  set /a money-=%price%
  ping -n 2 127.0.0.1 > NUL
  echo Kauf erfogreich
  call :shop
)
pause
exit /b
:: Ende des Hauptcodes.


:: Hole Preis
:getPrice FileName Line VarName
<"%~1" (for /l %%i in (1 1 %~2) do set /p "%~3=")  
exit /b

:: Bei Fehler
:fail
echo Du hast nicht genug Geld.
echo Was weiter passieren soll weiss ich nicht.
exit /b

:: Shop
:shop
echo Du hast %money% Geld.
echo Was weiter passieren soll weiss ich nicht.
exit /b

Versuche mal ohne GOTOs auszukommen. Damit bekommst du Spaghetticode, bei dem du irgendwann selbst nicht mehr weißt, wohin überall gesprungen wird. Versuche es mit CALL :Label, mit EXIT /B kehrst du an die Stelle zurück, an dem der Aufruf stattgefunden hat.
GOTO ist nur was für Schleifen, die mit FOR nicht abzubilden sind.

Grüße
rubberman
Budders
Budders 20.04.2013 um 12:00:07 Uhr
Goto Top
Ich bin beeindruckt. :o
vielen Dank für die Hilfe, es funktioniert super!
Und danke für den Tipp mit CALL und EXIT /B!
Ich habe nie was anderes gelernt bzw. mir was anderes beigebracht, da ich bis heute immer gut damit zurecht gekommen bin, aber man lernt ja nie aus face-smile

Danke und einen schönen Samstag wünsche ich.
rubberman
rubberman 20.04.2013 um 12:05:56 Uhr
Goto Top
Hallo Budders,

gern geschehen face-wink

Du bist nicht der einzige, der mit Hunderten GOTOs in Batch arbeitet. Das ist einer der Gründe warum Batch in Verruf gekommen ist. Man wird regelrecht verleitet Spaghetticode zu schreiben. Aus vielen anderen Sprachen wurde GOTO rigoros verbannt. Wenn du also mal vorhast eine andere Sprache zu lernen, wirst du es sehr schwer haben Lösungen zu finden, die ohne GOTO auskommen. Also am besten gar nicht erst angewöhnen face-wink

Grüße und ebenfalls ein schönes WE
rubberman