Batch Recht simpler else Befehl, den ich nicht Verstehe?

S

Sid

Gast
Wenn tab kleiner oder gleich groß ist wie %dec%, soll nicht addiert oder subtrahiert werden.
Code:
if "%tab%" LEQ %dec% (set /a var = %dec%)
Soll dann nicht ausgeführt werden:
Code:
if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%
Ich habe es mit else versucht, leider ohne Erfolg.
Wie baue ich das in den unteren code?

Es sollen min. 77 Hexwerte berechnet werden, die aus einem Textfile importiert werden.
Ist es möglich den Code zu kürzen, ohne ihn für jeden Wert 77 mal zu wiederholen?
Hier im Beispiel sind es nur 3 Werte.



Code:
@echo off &setlocal
set /p tab="Enter begin of table in decimal "
set /p len="Enter length in decimal "
set /p z="Enter + or - 

set /a dec=0xc01e%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

set /a dec=0xc088%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

set /a dec=0xc0e0%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

pause
Danke für die Hilfe. :D
 
s.u.
 
Zuletzt bearbeitet:
Ich habe es so eingefügt, aber er berechnet den Wert trotzdem?
Auch mit LEQ, fehlt da nicht ein Befehl?

Code:
@echo off &setlocal
set /p tab="Enter begin of table in decimal "
set /p len="Enter additional lenght in decimal "
set /p z="Enter + or - 

set /a dec=0xc01e%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if "%tab%" GTR %dec% (set /a var = %dec%)
( if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%)
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

set /a dec=0xc088%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if "%tab%" GTR %dec% (set /a var = %dec%)
( if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%)
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

set /a dec=0xc0e0%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if "%tab%" GTR %dec% (set /a var = %dec%)
( if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%)
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

pause
 
Soll set /a var = %dec% ausgeführt werden falls tab kleiner oder gleich groß ist oder nur falls nicht ?
 
Set /a var = %dec% soll immer ausgeführt werden.
Aber wenn tab kleiner oder gleich groß ist wie %dec%, soll nicht addiert oder subtrahiert werden (%len% ignorieren).
Soll set /a var = %dec% ausgeführt werden falls tab kleiner oder gleich groß
Edit: Ja, falls.
 
Zuletzt bearbeitet von einem Moderator:
Wobei Du das set /a eigentlich vor die 1. if Anweisung setzen könntest
 
Zuletzt bearbeitet:
if "%tab%" GTR %dec% (
set /a var = %dec%
if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%) else (
set /a var = %dec%)
 
So wird garnicht gerechnet, egal welche Zahl ich eingebe.

Code:
@echo off &setlocal
set /p tab="Enter begin of table in decimal "
set /p len="Enter additional lenght in decimal "
set /p z="Enter + or - 

set /a dec=0xc01e%~1

if "%~2" NEQ "" (SET %~2=%dec%)

if "%tab%" GTR %dec% (
set /a var = %dec%
if "%z%"=="+" set /a var = %dec% + %len%
if "%z%"=="-" set /a var = %dec% - %len%
) else (
set /a var = %dec%
) 

cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
echo %hex%

pause
 
Code:
if %tab% LEQ %dec% (
  	set /a var=dec
) else (
  	if "%z%"=="+" set /a var=dec+len
  	if "%z%"=="-" set /a var=dec-len
)
Die 77 Wiederholungen können sicher kürzer geschrieben werden. Dazu fehlen Angaben zur Textdatei, der Variablen dec und den Aufrufparametern der Batch. Die Berechnung von Hexzahlen über den Aufruf von cmd ist möglich, aber langsam.
 
Danke, das funktioniert wunderbar! :)
Die Kürzung des Codes ist nicht so wichtig, ich bin erstmal froh, dass es funktioniert.

Das Tool dient zum editieren von Command und Data Tables im AMD ATOMBIOS.
Diese muß man editieren, um z.B. Automatic voltage offset in eine 290X zu modden, die garkeinen hat.

Die Textdatei, die importiert wird:
Code:
A6 00 01 01 1E C0 88 C0 E0 C0 12 E0 E0 EF 9C C1 00 00 16 E1 00 00 58 C7 58 C8 9A C9 98 CA B8 CF B4 D0 04 D1 68 EB D6 EC 14 D4 26 D5 86 D5 FA D5 00 00 00 00 70 D6 00 00 00 00 00 00 B2 FA 00 00 EA FA A2 FB 00 00 22 D7 9C D7 D4 D7 12 D8 C0 D9 FA D9 00 00 1C DA 00 00 36 DA E6 DA 70 DC BA DC 00 00 94 DD DE DD 2C DE 00 00 00 00 54 DF 24 E1 08 E2 00 00 42 E4 A2 E4 D0 E4 DA E4 F2 E4 7A E5 A8 F1 DA E5 9A E7 F4 EA 00 00 60 ED 00 00 00 00 EC EE 66 D1 C2 D2 00 00 00 00 00 00 D2 F1 00 00 2E F8 56 FA 7A EE 48 00 01 01 00 00 00 00 00 00 0E A7 EE A8 5A A9 5E AC 7A BC 00 00 00 00 AC AC 88 AD 94 AD C0 AD 00 00 D4 AE 00 00 62 BC 00 00 D8 B0 00 00 00 00 DE B0 64 B2 00 00 00 00 B4 BB F4 BB E2 B2 00 00 00 00 00 00 04 BB 00 00
Um für alle AMD Karten kompatibel zu sein, müssen alle schwarzen Werte gelesen werden.
Ab A6 00 01 01 Command Tables und ab 48 00 01 01 Data Tables.
d0wa3pc3cqj640mvy.png


Dazu sind noch einige Dinge nötig:

1. Der Hexwert dec 0000 darf mit len nicht addiert oder subtrahiert werden:
Code:
  	if "%z%"=="+" set /a var=dec+len
  	if "%z%"=="-" set /a var=dec-len

2. Die Eingabe tab soll in Hex erfolgen und dann intern in decimal umgerechnet werden.

Hier werden ersmal nur die ersten drei Hexpaare berechnet, im BIOS sind diese verdreht:
Code:
@echo off &setlocal
set /p tab="Enter begin of table in decimal "
set /p len="Enter additional lenght in decimal "
set /p z="Enter + or - "
set /p y="Result: (h)ex (s)witch position of hex pairs "
set /p str=<Table.txt

REM Command Tables:

set /a dec=0x%str:~15,2%%str:~12,2%%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if %tab% LEQ %dec% (
        set /a var=dec
) else (
        if "%z%"=="+" set /a var=dec+len
        if "%z%"=="-" set /a var=dec-len
)
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
if "%y%"=="h" echo %hex%
if "%y%"=="s" echo %hex:~2,4% %hex:~0,2%

set /a dec=0x%str:~21,2%%str:~18,2%%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if %tab% LEQ %dec% (
        set /a var=dec
) else (
        if "%z%"=="+" set /a var=dec+len
        if "%z%"=="-" set /a var=dec-len
)
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
if "%y%"=="h" echo %hex%
if "%y%"=="s" echo %hex:~2,4% %hex:~0,2%

set /a dec=0x%str:~27,2%%str:~24,2%%~1

if "%~2" NEQ "" (SET %~2=%dec%)
if %tab% LEQ %dec% (
        set /a var=dec
) else (
        if "%z%"=="+" set /a var=dec+len
        if "%z%"=="-" set /a var=dec-len
)
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
if "%y%"=="h" echo %hex%
if "%y%"=="s" echo %hex:~2,4% %hex:~0,2%

pause
Ergänzung ()

#1. Habe ich gelöst, wenn dec=0:
Code:
if %dec%==0 (
        set /a var=dec
) else (
        if %tab% LEQ %dec% (
        set /a var=dec
) else (
        if "%z%"=="+" set /a var=dec+len
        if "%z%"=="-" set /a var=dec-len
))
Das Ergebnis wird auch als 00 00 angezeigt, anstatt Fehler:
Code:
if %dec%==0 (
        echo 00 00
) else (
        if "%y%"=="h" echo %hex%
        if "%y%"=="s" echo %hex:~2,4% %hex:~0,2%
)

Die Batch ist fertig, so sieht der Anfang aus:
Code:
@echo off & setlocal
set /p tabh="Enter begin of changed table in hex "
set /p lenh="Enter lenght difference of table in hex "
set /p z="Enter (+) or (-) for lenght difference "
set /p y="Result: (h)ex (s)witch position of hex pairs "

set /a tab=0x%tabh%
set /a len=0x%lenh%

set /p str=<Table.txt

REM Command Tables:
echo A6 00 01 01

set /a dec=0x%str:~15,2%%str:~12,2%

if %dec%==0 (
        set /a var=dec
) else (
        if %tab% GEQ %dec% (
        set /a var=dec
) else (
        if "%z%"=="+" set /a var=dec+len
        if "%z%"=="-" set /a var=dec-len
))
cmd /c exit /b %var%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"
if %dec%==0 (
        echo 00 00
) else (
        if "%y%"=="h" echo %hex%
        if "%y%"=="s" echo %hex:~2,4% %hex:~0,2%
)
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben