shadowminder
Goto Top

Batch Logik Error bei if statement

Hallo zusammen!

ich stehe in Batch grad auf dem wortwörtlichen schlauch... :C

Ich wollte heute ein Überprüfungsmodul in unser in Batch geschriebenes neurales Netzwerk eingliedern, aber aus unerklärlichen gründen will es nicht funktionieren und das Fenster schließt sich.

hier ein ausschnitt aus dem code:

(...)

set Temp1=!LayerCell%i%!

::-------------------------------

:: hier passiert der fehler

if !Temp1:~0,1!==0 (

::-------------------------------

pause

set Temp1=!Temp1:~-1,1!

)

echo !Temp1!

(...)

der code überprüft, ob sich an der ersten stelle der variable !Temp1! eine 0 befindet und wenn dies wahr ist, soll der wert von !temp! nur die letzte ziffer sein

Wenn sich irgendjemand mit stringmanipulation auskennt, gerne antworten!

LG Shadowmind

Content-ID: 599700

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

145033
145033 27.08.2020 aktualisiert um 16:49:00 Uhr
Goto Top
if !Temp1:~0,1!==0 (
Da eine Variable komplett leer sein kann sollte man bei if Vergleichen die Variablen stets mit zusätzlichen Zeichen versehen da es ansonsten zu einem Fehler kommt, bspw. mit Anführungszeichen einkappseln
if "!Temp1:~0,1!" == "0" (  
Dann stört auch eine leere Variable oder Leerzeichen nicht den IF Vergleich.

Genau so bei dem Setzen von Variablen lieber auf Nummer sicher gehen und diese mit Anführungszeichen sicher machen.
set "Temp1=!LayerCell%i%!"  
Shadowminder
Shadowminder 27.08.2020 aktualisiert um 16:55:42 Uhr
Goto Top
Danke für deinen vorschlag, kleiber.

ich habe in der zwischenzeit einen workaround gefunden, und ich werde den lösungscode natürlich zeigen.

zu deiner befürchtung, das !Temp1! leer sein kann: das system ist so gebaut das !Temp1! nie leer ist.

Lösung:

set Temp1=!LayerCell%i%!
set Temp2=!LayerCell%i%!
set Temp2=!Temp1:~0,1!
if !Temp2!==0 (
set Temp1=!Temp1:~-1,1!
)
set /a Temp1=!Temp1!-1
if !Temp1! LSS 10 (
set Temp1=0!Temp1!
)

Falls sich jemand fragt wie man ein neuronales Netzwerk in batch verwirklichen könnte, hier der sourcecode unserer Batch:

PS: die batch ist noch nicht fertig!
@echo off
setlocal EnableDelayedExpansion

::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Check How big the Network is :O
::::::::::::::::::::::::::::::::::::::::::::::::::::

set cells=0
for %%a in (".\*.cell") do (  
set /a cells+=1
set cell!cells!=%%~na
for /f "usebackq delims=" %%f in (".\%%~nxa") DO (  
set "a=%%f"  
set weight!cells!=!a!
)
)
echo the network has %cells% cells!
pause

::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Shows the current network state :}
::::::::::::::::::::::::::::::::::::::::::::::::::::

set i=0
:loop1
set /a i+=1
echo Cell:      !cell%i%!
echo Weight:    !weight%i%!
echo.

::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Check how many Layer the network has ;)
::::::::::::::::::::::::::::::::::::::::::::::::::::

set s=!cell%i%!
set t=%s%
set x=0
:loop2
for /f "tokens=1* delims=." %%a in ("%t%") do (  
    set /a x+=1
   set a=%%a
   set val!x!=!a!
   set t=%%b
   )
if defined t goto :loop2
set LayerCell!i!=!val1!
set CountCell!i!=!val2!
if %i%==%cells% goto break1
goto loop1
:break1
set Layer=!LayerCell%cells%!
echo the network has %Layer% layers!
pause

::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Testing stuff :D
::::::::::::::::::::::::::::::::::::::::::::::::::::

set /p PickLayer=which layer show:
set i=0
:loop3
set /a i+=1
if !LayerCell%i%!==%PickLayer% echo !cell%i%!
if %i%==%cells% goto break3
goto loop3
:break3
pause


set /p input=Number:
set i=0
echo.
:loop4
set /a i+=1
if !LayerCell%i%!==01 (
set /a output!i!=%input%*!weight%i%!
echo first layer !LayerCell%i%!
echo input: %input%
echo weight: !weight%i%!
echo output: !output%i%!
) else (
if !LayerCell%i%!==%Layer% (
echo last layer !LayerCell%i%!
echo input: --
echo weight: !weight%i%!
echo output: !output%i%!
) else (


set Temp1=!LayerCell%i%!
set Temp2=!LayerCell%i%!
set Temp2=!Temp1:~0,1!
if !Temp2!==0 (
set Temp1=!Temp1:~-1,1!
)
set /a Temp1=!Temp1!-1
if !Temp1! LSS 10 (
set Temp1=0!Temp1!
)

call :input !Temp1!

echo Previous layer !Temp1!
echo hidden layer !LayerCell%i%!
echo input: !input!
echo weight: !weight%i%!
echo output: !output%i%!
)
)
echo.
echo =====================
echo.
if !LayerCell%i%!==%Layer% (
if %i%==%cells% goto break4
)
goto loop4
:break4
pause
exit

:input
echo %1
pause
goto :eof

PS: bei vorschlägen einfach schreiben

LG Shadowmind
145033
145033 27.08.2020 aktualisiert um 17:43:18 Uhr
Goto Top
Die zweite Variable ist überflüssig, geht auch so.

screenshot


Falls sich jemand fragt wie man ein neuronales Netzwerk in batch verwirklichen könnte
Nee, ich fahr mein Fahrrad ja auch nicht mit dreieckigen Reifen 🙈