Wo ist der Fehler bei diesem code?

... komplette Frage anzeigen

2 Antworten

Wenn Du eine SET-Anweisung innerhalb einer IF- oder FOR-Anweisung setzt, so bleiben diese Variablen auch nur innerhalb dieser Verkapselung bestehen.

Es gitb einen Trick, um das zu umgehen:
(der Lesbarkeit halber mit Groß/Kleinschreibung, ist aber egal)

SetLocal EnableDelayedExpansion

Diesen befehl setzt man irgend wo for allen IF's und FOR's, iam Besten gleich nach "@echo off".

Dieser Befehl macht erst einmal alle Variablen nur lokal in der Batch gültig, so dass man sich auch keine Gedanken um die Persistenz der Variablen nach Beendigung der Batch machen muss. Außerdem werden die Verfügbarkeiten von Variablen global in der Batch verfügbar gemacht, so dass diese auch außerhalb von IF- und FOR-Verkapselungen bestehen bleiben.

Allerdings wird durch den Parameter jetzt eine geänderte Syntax der Variablen erforderlich. Anstatt des "%" zum Umschließen des Namens ist jetzt das "!" erforderlich, damit die Variable auch sofort nach der Set-Anweisung verfügbar ist. Das "%" ist weiterhin gültig, aber die Auswertung der Variable erfolgt dann sehr verzögert, so dass in den folgenden Ablaufschritten nicht der zuletzt gesetzte Wert ausgelesen werden kann. Meistens geht das Auslesen dennoch gut, wenn eine Variable außerhalb einer Verkapselung nur einmal gesetzt wurde. Aber man sollte sich besser darauf konzentrieren, dann immer das "!" zu verwenden.

Mit dem Befehl

SetLocal DisableDelayedExpansion

kann diese Sonder-Auswertung wieder deaktiviert werden und dann hat das "!" keine Bedeutung mehr für die Variablen-Auswertung, sondern ist einfach nur ein Ausrufezeichen.

Mit dem Befehl

EndLocal

werden dann auch alle danach gesetzten lokalen Variablen wieder für die aktuelle CMD-Umgebung verfügbar gemacht.

––––––––––

if "%N%"=="[X]" set N=. && set J=[X] && goto A

Solche Code-Konstrukte solltest Du bei SET besser vermeiden, da es sein kann, dass alles hinter dem ersten "=" der Variable zugewiesen wird. Da muss man bei Batch immer von aufpassen. Das geht auch viel besser so:

if "%N%"=="[X]" (
set N=.
set J=[X]
goto A
)

––––––––––

Das Null-Gerät wird mit einem "L" geschrieben:

pause >NUL

Mit Deinem ">Null" wird die PAUSE-Ausgabe in eine Datei mit dem Namen "Null" geschrieben.

––––––––––

mode 1000

Was willst Du mit diesem Befehl bezwecken?

Hinter MODE kommt erst einmal ein Gerätename (CON, LPT1, etc.) und dann die Geräte-spezifischen Schalter.

Antwort bewerten Vielen Dank für Deine Bewertung

Also ich würd des ganze Menü anders machen:

probiers mal aus und sag mir wie du des findest ;)

@echo off & setlocal enableDelayedExpansion

if not exist C:\\Windows\\System32\\batbox.exe ( call :batboxer )
color f0
:mouse
batbox /g 1 1 /c 0xf0 /d "MENU"
batbox /g 1 3 /c 0xf1 /d "option1"
batbox /g 1 4 /c 0xf1 /d "option2"
batbox /g 1 5 /c 0xf1 /d "option3"

for /f "delims=: tokens=1,2" %%A in ('batbox /m') do (
set x=%%A
set y=%%B
)

if %x% GEQ 1 ( if %x% LEQ 7 (
goto :Clic
)
)
goto :mouse
:Clic
if %y%==3 batbox /g 1 3 /c 0xfc /d "option1" /w 300 /c 0xf0 & cls & goto opt1
if %y%==4 batbox /g 1 4 /c 0xfc /d "option2" /w 300 /c 0xf0 & cls & goto opt2
if %y%==5 batbox /g 1 5 /c 0xfc /d "option3" /w 300 /c 0xf0 & cls & goto opt3
goto :mouse

:opt1
echo you clicked option1
pause
goto :eof

:opt2
echo you clicked option2
pause
goto :eof

:opt3
echo you clicked option3
pause
goto :eof

:batboxer cd /D C:\\Windows\\System32\\
for %%b in (
4D5343460000000073030000000000002C000000000000000301010001000000
00000000470000000100010000060000000000000000FE4259B5200062617462
6F782E657865003FD9412724030006434BB5545F485361143F5737F0CF726B3A
102ABB528B1EC24813421026D3529AB59C184460D7ED6EF7CE79EFB8F74A562F
0B1D543EF5143DC60483C27AF0C14248B18710A4979ECA40426A0329A1B21ECA
AF73EE9D4E21B287FAB6DF77CFF99DF37DDFEF3B3B779D1752C001800D5CC018
808F1C1C3ED879A41015FB9F56C064E942ED141758A8ED96649D4F6A6A4C1306
F8B0A028AAC1F789BC36A8F0B2C2B79E0DF1036A44ACDB557670638F601B4080
E3A0C3FBFDDC06B7044EAE9CE34EA2283041C3B505A48E9E450079B99B69C05B
FC4B1457BC75DD6666DECD8F981BE02EF71797FDC7A32E9A100C7C1EB1E505D9
2CDD5BC7252AC57F1E92ABCA0771EB21D968029C98E76125D25F9967D1ED838C
8372D6F24E093AD9175832FFADCAD43C7F8C459F9442D39D1E8C3947C6913F15
7BB79A7BCD18CBA6D10BB24687B9E33226E4E6904E5DE37A9DE90A3C9C7926F1
98F48C73E401F2CC731FBD66BAB2335D6E8689B0336A13E6798C76B601772CB6
F7E2565EEAD64C1589A931C93092B34B2ECE4E1C6BB466EBE82C1DDD4E8A3ED3
5ED25137B163B861AE9ED8B7D452F182D42F945F4D111213920E14F28B908D57
B3C61233710903560539A9DA3CD0E257901F6EA600D664019744879B295EE44C
3F43EF9BFD303A3FD172A61FE13CDABC17FD9BEBB39F5CD7DFD3BDEEF155565D
6E63B4D8CC0E9EEF910E15745C5D47755EAB32AB245726A20A890C55275B4616
952417A44035BA71FC8498670A970F3F77CCCD7E2862E3F524D44EBFBB6D741F
3D46F7A4DF3847E885988B835574AF0EDE4893F9056F1874970F26101F111711
B6DD3EA8411C472C20A611FD31211C8D0CA89737DAEC4665A1E532F8CA8DA13F
ED2E7013682FBA7FDFA29DA11E7F57775D6B2000A7DBBACEB4051AEA4D077EE0
02076E54833881E846488864FEB09DE2D8AAA2113222ED82124988E48744C3AF
2ABA9A103BF17F6A3BD32D0E192D86A1C97D8386B82DE21FD474550BAABA6CC8
AA42ABBA4421920F7628C941A385F213A298DCB6AE55D69309E18A79D40C6A9A
47BC422C2356106B799D7F8AE16D345931A264F5C644232C9916990382AC085A
4C475F1C920D93EFEF932C4B3734434D00FC02
) Do >>t.dat (Echo.For b=1 To len^("%%b"^) Step 2
ECHO WScript.StdOut.Write Chr^(Clng^("&H"^&Mid^("%%b",b,2^)^)^) : Next)
Cscript /b /e:vbs t.dat>batbox.ex_
Del /f /q /a t.dat >nul 2>&1
Expand -r batbox.ex_ >nul 2>&1
Del /f /q /a batbox.ex_ >nul 2>&1

goto :eof
Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?