Was ist mit diesem Batch-Skript falsch?

3 Antworten

Jetzt beende ich mal das Heitere Rätselraten...

da sind so viele logische Fehler in der gesamten batch, das ich sie gleich beim Fixen kommentiert habe.

...aber warum geht nun die Zeile:

echo Konto nicht vorhanden oder Benutzername falsch timeout /t 2 >nul cls goto welcome

nicht zu :welcome?

dicker Fehler :

der Text : Konto nicht vorhanden oder Benutzername falsch timeout /t 2 wird in die Datei nul umgeleitet und den Rest beachtet der Parser garnicht mehr.

Mehrere Befehle in einer Zeile werden mit & voneinander getrennt.

echo Konto nicht vorhanden oder Benutzername falsch & timeout /t 2 >nul & cls & goto welcome

Das sollte man nur tun, wenn es aus irgendeinem Grund erforderlich ist , ( zb. keine Klammern verwenden darf, wo diese als Befehlsverkettung nötig wären nötig wären.)

Ansonsten sollte gelten eine Zeile ,ein Befehl (bei den Heutigen Rechnern und Festplatten macht das einen unterschied von einigen Millisekunden.)

Das war das dickste Ding.

%username%, %user% , %userprofile% sind vordefinierte Systemvariable, diese darfst du nicht setzen, sonst kann es zu den verschiedensten Nebenwirkungen kommen! 

Das nächste , bei relativen Pfaden .\ weglassen . es genügt pfad\Pfad\pfad...

cd .\users\ 
mkdir %newusername% 
echo %newpassword% > .\users\%newusername%\%newusername%.dll

...wechselt in den Ordner users erzeugt ein Verzeichnis %newusername% . wechselt dann jedoch nicht zurück... und versuch im Ordner users ! in eine Datei in dessen Unterordner users\%newusername% (der nicht existiert) zu schreiben.

🥵🥵🥵....falsche Etage.... im leben passt der Wohnungschlüssel blos nicht und der Nachbar guckt böse... 😂😂😂

Das sind die Tücken der relativen Pfade ich arbeite sonst prinziepell mit den Dingern. Bei voll automatisierten Batches kann man sich da schon mal in "einer andern Stadt" verirren.

Bliebe noch meine "Gänsefüßchen"-predigt: set [/p /a] immer so verwenden:

set /p "variable=irgendwas"

Wenn der Nutzer ohne diese Sysntax ein Steuerzeichen <>|^& usw. eingibt, stürtzt die Batch ab!!!

Damit zum Thema Sonderzeichen in Dateinamen . <>|":\/*? sind nicht erlaubt. Was der Nutzer eingeben wird weißt Du nicht. Also muss man die Dummheit des Nutzers Abfangen. das ist im korrigierten Code erklärt.

schau auch auf https://ss64.com/nt/ und https://ss64.com/nt/syntax.html

nun die gefixte Batch. ich kann auch etwas übersehen haben... aber bei mir lief es, sogar wenn mein Username Erz<\|/>":?esel ist....

@echo off
  rem Wichtig  bei relativen Pfaden! sicherstellen, das wir auch  im Ordner mit der Batch arbeiten  (gehe zum Batchpfad)
cd /d "%~dp0"


title MESSENGER
mode con: cols=50 lines=10
if exist "Kontakte\Users" goto welcome


:firstOpen 
  rem optimiert... da war zuviel herumgespringe in den Verzeichnissen
  rem Man kann auch einen ganzen Pfad in einem Rutsch erstellen
md "Kontakte\Users" 
copy "kontakte.bat" "Kontakte\kontakte.bat" 
cd "Kontakte" 
start "" "kontakte.bat" 
cd "..\ 
:del /F kontakte.bat 
::exit /b




:welcome 
cls 
color 0A 
echo. 
echo =============== 
echo    MESSENGER 
echo ===============  
echo.                                            pause 
color 0B 


:login 
cls
echo. 
echo =========== 
echo    Login    
echo =========== 
echo. 
echo Gib deinen Benutzernamen ein  " * " ist nicht erlaubt: 
echo (Wenn du kein Konto hast, druecke nur Enter) 
  rem  %username%, %user% , %userprofile%  sind vordefinierte Systemvariable, diese darfst du nicht setzen, sonst  kann es zu den verschiedensten  Nebenwirkungen  kommen! 
::set /p username= 
set /p "workUserName="
if "%workUserName%"=="" goto :createaccount 
  rem siehe create!  hätte ich  normalerweise in einer Subroutine untergebrach, wollt Dich  in diesem stadium  nicht mit Dynamischen  Variablenamen erschlagen
set "workUserName=%workUserName:\=_b_%"
set "workUserName=%workUserName:/=_s_%"
set "workUserName=%workUserName:|=_p_%"
set "workUserName=%workUserName:>=_g_%"
set "workUserName=%workUserName:<=_k_%"
set "workUserName=%workUserName:"=_q_%"
set "workUserName=%workUserName:?=_f_%"
set "workUserName=%workUserName::=_d_%"
  rem nächste 2zeilen können weg  nur zur Veranschaulichung
echo Nutzername " /\|<>?"  " korrigiert %workUserName%
pause
  rem teste ob erlaubter Nutzername eingegeben wurde
  rem trick: ein Ordner mit unerlaubten Zeichen  kann nicht erstellt werden :)  || bedeutet "bei Fehler mache"  2>nul bedeutet "Fehlermeldung unterdrücken"
md "%temp%\%workUserName%" 2>nul || (
  echo Unerlaubtes Zeichen " * " im Nutzernamen
  timeout 2
  goto :login 
)
  rem den ordner  einfach wieder löschen
rd /s /q "%temp%\%workUserName%"
:::::::ende Namensmanipulation:::::::
 
cls 


echo Gib jetzt dein Passwort ein: 
set /p "password=" 
if exist "users\%workUserName%\%workUserName%.dll" goto passwordcheck 
  rem hier  liegt der Hund begraben, wenn man mit Befehlen in einer Zeile nicht umgehen kann sollte man es nicht tun :)
::echo Konto nicht vorhanden oder Benutzername falsch timeout /t 2 >nul cls goto welcome
echo Konto nicht vorhanden oder Benutzername falsch 
timeout /t 2 >nul
cls 
goto welcome
rem auch  richtig aber  unübersichtlich und eine Fehlerquelle (lässt sich  nur schwer beim Debuggen erkennen) wäre:
::echo Konto nicht vorhanden oder Benutzername falsch & timeout 2 >nul & cls & goto welcome




:createaccount 
cls
echo. 
echo ======================= 
echo    Account erstellen 
echo ======================= 
echo. echo Gib deinen neuen Benutzernamen ein  (das Zeichen " * " ist nicht erlaubt)  : 
set /p "newusername=" 
  rem jetzt kommt etwas an das  Du  noch garnicht gedacht hast...
  rem es gibt Zeichen , welche nicht in Datei/Ordnernamen erlaubt sind  /\|"<>*:?
  rem Du kannst  nicht verhindern,  das jemand diese Zeichen eingibt
  rem * kann man leider nicht ohne enormen aufwand entfernen oder ersetzen (wäre später mal ne Frage wert)
  rem also prüfen wir nur ob dieses Zeichen enthalten ist und lassen einen anderen Namen eingeben.
  rem ...un da wir ohnehin einen Ordner erstellen wollen
  rem ersetze /\|"<>: durch eine entsprechende Zeichenkobination , ganz wichtig "Gänsefüße"
set "newusername=%newusername:\=_b_%"
set "newusername=%newusername:/=_s_%"
set "newusername=%newusername:|=_p_%"
set "newusername=%newusername:>=_g_%"
set "newusername=%newusername:<=_k_%"
set "newusername=%newusername:"=_q_%"
set "newusername=%newusername:?=_f_%"
set "newusername=%newusername::=_d_%"
  rem auf diese art  kannst du  nahezu jedes Zeichen austauschen oder entfernen


  rem nächste 2zeilen können weg  nur zur Veranschaulichung
echo Nutzername " /\|<>?"  " korrigiert %newusername%


md "users\%newusername%" 2>nul || (
  cls
  echo Unerlaubtes Zeichen " * " im Nutzernamen konnte nicht entfernt werden.
  timeout 2
  goto :createaccount 
) 


cls 
echo Gib dein neues Passwort ein: 
set /p "newpassword=" 
  rem den ordner %newpassword% habe ich bereits  beim Testen erstellt!
  rem  bei Deiner Variante mit cd users  hättest du versucht eine Datei im Ordner users\users\%newusername%\ zu erstellen, was naturlich  nicht  geht... ()die verhängnisvollen relativen Pfad ;p
  rem ich habe an dieser stelle jedoch keine Muse zu erklären wie das geht  
echo "%newpassword%" > "users\%newusername%\%newusername%.dll"


cls 
echo Dein Account wurde erstellt 
timeout /t 2 >nul 
cls 
goto login


:passwordcheck 
set /p passwordfile=<"users\%workUserName%\%workUserName%.dll" 
  rem auch  beim vergleichen "Gänsefüßchen" verwenden,  falls  als Passwort  mal Sonderzeichen werden, würde sonst die Batch  abstürzen
if "%passwordfile%"=="%password%" goto loggedin




:loggedin 
cls
echo Hallo
pause


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Erzesel  18.04.2019, 12:47

ps : habe vergessen ein paar Auskommentierungen zu entfernen:

:del /F kontakte.bat 
::exit /b

doppelpunkte wegmachen...

0
Erzesel  18.04.2019, 12:53
@Erzesel

ich arbeite natürlich sonst nicht mit relativen Pfaden . schreibfehler .. weist schon falsche Stadt...😂😂😂

0

Die Leerzeilen sieht man leider nicht

Woher ich das weiß:Hobby

Simikolon am ende?

Bin mir aber nicht sicher

CrazyJannis444 
Fragesteller
 17.04.2019, 22:03

nein nicht bei batch

0