118551
Goto Top

Probleme Im Batch Menü

Hallo Leute ich wollte nur ein (Batch Spiel) Programmieren

dabe tratt das problemm auf

"set" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

@echo off

set B=^^^<-----
set L=
set E=

:Start
echo Wilkommen zu Unnamed-Game
echo.
echo Neues Spiel Beginnen %B%
echo SpielStand Laden     %L%
echo Beenden              %E%
echo --------------------------
choice /n /c:wse
if errorlevel 255 goto Start
if errorlevel 3 goto Bestaetigen
if errorlevel 2 goto Runter
if errorlevel 1 goto Hoch
if errorlevel 0 goto Start

:Hoch
if %B%==^<----- set B= && set L= && set E=^^^<----- && cls && goto Start  
if %L%==^<----- set B=^^^<----- && set L= && set E= && cls && goto Start
if %E%==^<----- set B= && set L=^^^<----- && set E= && cls && goto Start

:Runter
if %B%==^<----- set B= && set L=^^^<----- && set E= && cls && goto Start  
if %L%==^<----- set B= && set L= && set E=^^^<----- && cls && goto Start
if %E%==^<----- set B=^^^<----- && set L= && set E= && cls && goto Start

:Bestaetigen
if %B%==^<----- call New-Game.bat
if %L%==^<----- call Load-Game.bat
if %E%==^<----- exit

Wenn ich bei den IF´s wie im code es versuche kommt es beim zweiten mal w oder s drücken
Wenn ich bei den IF´s es so versuche if %L%==^^^<----- dann kommt es direkt wenn ich w oder s drücke
Wenn ich die ^ ganz weglasse geht es erst recht nicht

Kann mir einer Helfen

Danke im Vorraus

Content-Key: 264230

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

Printed on: April 23, 2024 at 14:04 o'clock

Member: rubberman
rubberman Feb 22, 2015 updated at 21:19:22 (UTC)
Goto Top
Hallo DomiZone1,

ich weiß wirklich nicht, warum du so ein kryptisches Zeug als Variablenwert setzen musst, ist aber letztlich nicht der Grund für den Fehler. Irgendwann (vermutlich "beim zweiten mal w oder s drücken") ist eine deiner Variablen beim Vergleich nicht definiert. Sagen wir mal %B% würde zu einem leeren String expandiert werden, dann sieht dein Vergleich etwa so aus:
if ==<----- set... 
Wen du dich hier im Forum mal umsiehst, wirst du kaum jemanden finden, der beim Setzen einer Variablen oder bei nicht-numerischen Vergleichen ohne Anführungszeichen arbeitet. Dann fällt dieser ganze Escape Quatsch weg. In deinem Fall gäbe es übrigens auch noch ein IF DEFINED um zu prüfen, ob eine Variable definiert ist (einen Wert hat).

Grüße
rubberman
Mitglied: 118551
118551 Feb 23, 2015 at 17:48:00 (UTC)
Goto Top
Das ein vergleich dann so aussieht ist ausgeschlossen! er sagt ja das der set befehl nicht verarbeitet werden kann und deshalb das ganze ding abstürzt der grund für diese kryptischen zeichen in den variablen soll einen pfeil darstellen damit der user weiss was gerade ausgewählt ist.

zu deiner sache mit den ohne die " arbeiten das mach ich schon seit ewigkeiten so und es hat noch nie probleme gegeben deswegen arbeite ich nicht mit den " das mal dazu ich habe es trotzdem mal ein bisschen mit denen rum gespielt und habe immer noch den fehler das das *set angeblich syntaktisch an dieser Stelle nicht verarbeitet werden kann*

evtl kannst du mir mal ein link geben wo ich das genau nachlesen kann wie das mann mit " arbeiten kann das habe ich noch nicht gesehen bzw vergessen wie es ging

Danke trotzdem für deine Antwort

LG DomiZone1
Member: rubberman
rubberman Feb 23, 2015 at 19:40:44 (UTC)
Goto Top
Hallo DomiZone1.

Das ein vergleich dann so aussieht ist ausgeschlossen!
Da bist du so was von auf dem Holzweg.
Teste:
set B=
if %B%==X set Y=Z
Fehlermeldung:
"set" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Schau doch einfach mal in deinen Code. Sowohl in Zeile 22, wie auch in Zeile 27 wird B negiert bzw. der Wert auf ein Leerzeichen reduziert (was den selben Fehler hervorruft), da du ein Leerzeichen zwischen = und && stehen hast. Eine dieser Zeilen wird aber beim 2. Durchlauf aufgerufen. Somit kann dein Code nur krachen gehen.

zu deiner sache mit den ohne die " arbeiten das mach ich schon seit ewigkeiten so
Und deshalb ist es automatisch richtig?
Teste:
set "B=<-----"
Erstaunlicherweise wird der Wert ganz ohne Escapesequenzen fehlerfrei gesetzt.
Ebenso wird ein
if "%B%"=="X" set "Y=Z"
keinen Fehler verursachen wenn B nicht definiert ist oder nur ein Leerzeichen enthält.

Alles Dinge, die man erst einmal probiert, bevor man erklärt, dass das alles Unsinn ist und man das ja schon immer anders gemacht hat face-wink

evtl kannst du mir mal ein link geben
Brauchst du ja nun nicht mehr face-smile

Grüße
rubberman
Mitglied: 118551
118551 Feb 25, 2015 at 17:32:04 (UTC)
Goto Top
Ich habe das jetzt mal "getestet" weil da eine fehlermeldung und ich nicht mehr wusste wie die hieß

Wenn ich es so mache set "B=<-----" kommt:
Das System kann die angegebene Datei nicht finden.

zweitens du kennst wohl den choice befehl noch nicht oder hast den code nicht wirklich gelesen

da ich choice mit den if errorlevel´n drin habe komme ich mit s eins runter mit w eins hoch im menü und bestätige mit e

ich drücke zum testen s um eins runter zu gehen was passiert ist da wir am anfang B gesetzt haben wird die erste if abfrage
bei (:Runter) bestätigt dann macht er weiter er soll b entleren damit ich da nichts mehr seh dann soll er L auf ^<----- setzen damit ich da was
sehe und die fehler meldung Das System kann die angegebene Datei nicht finden. nicht erscheint dann könnte ich den letzten eigentlich weglassen
aber das war (copy & paste) arbeit so dann sollte er die cmd clearen und zum (:Start) zurück springen nun sollte der pfeil eins weiter unten sein
so würde ich jetzt wieder s drücken wiederhollt er das alles noch mal nur das dies mal B nicht bestätigt sondern L bestätigt wird und das L jetzt
entlerrt und E auf den pfeil gesetzt wird nun das problem ist er scheitert direkt beim SET BEFEHL das wegen frage ich auch hier weil mir das
noch nie so passiert ist und ich keinen plan habe wie ich das beheben kann

Im übrigen arbeite ich mit (Windows 7 HomePremium 64 bit) nur damit du nicht mit win8 oder anderen versionen arbeitest und da gehts dann auf einmal

LG DomiZone1
Member: rubberman
rubberman Feb 25, 2015 at 22:57:14 (UTC)
Goto Top
Wenn ich es so mache set "B=<-----" kommt:
Das System kann die angegebene Datei nicht finden.
Joa, wenn du es mit ECHO ausgibst, nicht beim SET. Das wiederum hättest du gesehen, wenn du ECHO ON gesetzt hättest und die ganzen CLSs rausgeschmissen hättest. Die kannst du immer noch rein schreiben, wenn der Code mal läuft.
Also set "B=^<-----" sollte es dann auch für deinen Zweck tun.

zweitens du kennst wohl den choice befehl noch nicht oder hast den code nicht wirklich gelesen
Hehe, so so. Ich kannte den CHOICE Befehl schon, als er noch eine ganz andere Syntax hatte und bevor er mit XP vorübergehend verschwunden war, um mit Vista wieder aufzutauchen. Und natürlich habe ich deinen Code gelesen und weiß was er tun soll. Anders hätte ich dich wohl kaum auf deine Fehler aufmerksam machen können.

Was passiert den nun, wenn du jeweils beide Vergleichsoperanden in Anführungszeichen setzt?

Im übrigen arbeite ich mit (Windows 7 HomePremium 64 bit) nur damit du nicht mit win8 oder anderen versionen arbeitest und da gehts dann auf einmal
Hat damit überhaupt nichts zu tun.


BTW: Da du ja immer noch glaubst, mit Batch Spiele schreiben zu wollen, dann lass mich auch mal ein Spielchen machen, wie ein Menü aussehen könnte:
@echo off &setlocal

:: *** BENUTZERDEFINIERTE EINSTELLUNGEN ***
:: Menütitel
set "headline=SYSTEM-PROGRAMME"  

:: Menüpunkte, in Anführungszeichen und kommagetrennt:
set items="Eingabeaufforderung","Editor","Rechner","Windows-Explorer","Zeichentabelle"  

:: Menüzeile, die beim Start markiert sein soll
set /a "c=1"  

:: Farbkombination für die Markierung der Menüpunkte
set "col=4e"  

:: Tasten zum Navigieren nach oben und unten
set "up=W"  
set "down=S"  

::~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:: *** ASSOZIATIVES ARRAY ANLEGEN ***
set /a "n=0"  
for %%i in (%items%) do (
  set /a "n+=1"  
  setlocal EnableDelayedExpansion
  for %%j in (!n!) do (
    endlocal
    set "menitem_%%j= %%~i "  
  )
)

:: *** VARIABLE UND DATEI FÜR FARBIGE AUSGABE ANLEGEN ***
call :initColorPrint

:: *** HAUPTSCHLEIFE FÜR DAS ANZEIGEN DES MENÜS ***
:loop
cls
echo(&echo    *** %headline% ***&echo(
echo   nach oben: [%up%]   nach unten: [%down%]   bestaetigen: [Enter]
echo(&echo(
setlocal EnableDelayedExpansion
for /l %%i in (1 1 %n%) do (
  if %c%==%%i (call :colorPrintVar %col% menitem_%%i&echo() else echo !menitem_%%i!
)
endlocal
call :getchoice "%up%%down%"  
set "ret=%errorlevel%"  
if %ret%==2 (
  if %c%==%n% (set /a "c=1") else set /a "c+=1"  
  goto loop
) else if %ret%==1 (
  if %c%==1 (set /a "c=n") else set /a "c-=1"  
  goto loop
)

:: *** TEMPORÄRE DATEI LÖSCHEN ***
call :cleanupColorPrint
echo(

:: *** SUBROUTINE MIT DEM INDEX DES AUSGEWÄHLTEN MENÜPUNKTS AUFRUFEN ***
call :choice_%c%

:: *** PROGRAMM ENDE ***
exit /b

:: *** INTERNE SUBROUTINEN ***
:: Routine für ein CHOICE-ähnliches Verhalten
:getchoice ByVal_Choices
setlocal DisableDelayedExpansion
set "n=0" &set "c=" &set "e=" &set "map=%~1"  
for /f "eol=1 delims=" %%i in ('xcopy /lwq "%~f0" :\') do set "c=%%i"  
set "c=%c:~-1%"  
if defined c (
  for /f delims^=^ eol^= %%i in ('cmd /von /u /c "echo(!map!"^|find /v ""^|findstr .') do (  
    set /a "n += 1" &set "e=%%i"  
    setlocal EnableDelayedExpansion
    if /i "!e!"=="!c!" (  
      for /f %%j in ("!n!") do endlocal &endlocal &exit /b %%j  
    )
    endlocal
  )
) else endlocal &exit /b 0
endlocal &goto getchoice

:: Routinen für farbige Ausgabe von Text
:initColorPrint
for /F "tokens=1,2 delims=#" %%a in ('"prompt $H# &for %%b in (1) do rem"') do set "DEL=%%a"  
<nul >"%temp%\x" set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%.%DEL%"  
exit /b

:colorPrintVar ByVal_Color ByRef_StrVar
if not defined %~2 exit /b
setlocal enableDelayedExpansion
set "str=a%DEL%!%~2:\=a%DEL%\..\%DEL%%DEL%%DEL%!"  
set "str=!str:/=a%DEL%/..\%DEL%%DEL%%DEL%!"  
set "str=!str:"=\"!"  
pushd "%temp%"  
findstr /p /A:%1 "." "!str!\..\x" nul  
popd
exit /b

:cleanupColorPrint
del "%temp%\x"  
exit /b
::~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:: *** BENUTZERDEFINIERTE SUBROUTINEN choice_1 BIS choice_n (MIT n = ANZAHL MENÜPUNKTE) ***
:choice_1
start "" "%comspec%"  
exit /b

:choice_2
start "" "%SystemRoot%\system32\notepad.exe"  
exit /b

:choice_3
start "" "%SystemRoot%\system32\calc.exe"  
exit /b

:choice_4
start "" /max "%SystemRoot%\explorer.exe" /n,/e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}  
exit /b

:choice_5
start "" "%SystemRoot%\system32\charmap.exe"  
exit /b

Zwischen den beiden Linien mit den Tilden solltest du nichts ändern. Der Rest ist ausdrücklich zur Anpassung vorgesehen...

Grüße
rubberman