Was ist mit diesem Batch-Skript falsch?
Ich habe mit meinem Skript weitergemacht und habe wieder ein Problem nämlich bei:
createaccount;passwordcheck
Da steht immer Systempfad nicht gefunden
@echo on
title MESSENGER
mode con: cols=50 lines=10
if exist .\users\ goto welcome
:firstOpen
mkdir Kontakte
cd Kontakte
mkdir users
cd ..\
copy kontakte.bat .\Kontakte\kontakte.bat
cd Kontakte
start kontakte.bat
cd ..\
del /F kontakte.bat
exit
:welcome
cls
color 0A
echo.
echo ===============
echo MESSENGER
echo ===============
echo. pause
color 0B
cls
:login
echo.
echo ===========
echo Login
echo ===========
echo.
echo Gib deinen Benutzernamen ein:
echo (Wenn du kein Konto hast dann gib 1 ein)
set /p username=
cls
if %username%==1 goto createaccount
echo Gib jetzt dein Passwort ein:
set /p password=
if exist .\users\%username%\%username%.dll goto passwordcheck
echo Konto nicht vorhanden oder Benutzername falsch timeout /t 2 >nul cls goto welcome
:createaccount
echo.
echo =======================
echo Account erstellen
echo =======================
echo. echo Gib deinen neuen Benutzernamen ein:
set /p newusername=
cls
echo Gib dein neues Passwort ein:
set /p newpassword=
cd .\users\
mkdir %newusername%
echo %newpassword% > .\users\%newusername%\%newusername%.dll
pause
cls
echo Dein Account wurde erstellt
timeout /t 2 >nul
cls
goto login
:passwordcheck
set /p passwordfile=<".\users\%username%\%username%.dll"
if %passwordfile%==%password% goto loggedin
:loggedin
cls
echo Hallo
pause
Hier nochmal mit Leerzeilen
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
Die Leerzeilen sieht man leider nicht
Simikolon am ende?
Bin mir aber nicht sicher
ps : habe vergessen ein paar Auskommentierungen zu entfernen:
doppelpunkte wegmachen...