header-xh-01 header-xh-02 header-xh-03 header-xh-04 header-xh-05 header-xh-06 header-xh-07 header-xh-08 header-xh-09 header-xh-10 header-xh-11 header-xh-12 header-xh-13 header-xh-14
Lembach's nichtkommerzielle Website rund um CMSimple_XH
Templates, Plugins, Tools, Programme
und Tips und Tricks die mir wichtig sind
Sie sind hier: Startseite > Tipps und Tricks zusammengetragen > Batch-Menü zum Starten verschiedener lokaler Server
Letzte Bearbeitung:

Batch-Menü zum Starten verschiedener lokaler Server

Warum das ganze? So einen Link zu einem Server anklicken, ist doch einfach und bequem.

Ja, aber..
So fängt es an.

Warum also:
Ich habe alle meine Websites, also Domains und Subdomains, sozusagen als lebendes Backup, in lokal auf dem PC liegenden portablen Webservern gesichert. Zusätzlich habe ich eine ganze Anzahl lokaler Testwebsites, um daran meine Templates weiterzuentwickeln und sonstige Projekte voranzutreiben oder nur zum Herumprobieren.

Würde ich für jeden der Server einen Link auf den Desktop legen, hätte ich schnell einen ganzen Zoo mit Serverlinks. Bei Windows 10/11 ist es nicht mehr ganz so bequem wie früher zusätzliche Links ins Startmenü einzubauen (portable Anwendungen bauen ja nicht von selbst einen Link ins Startmenü). Ohne spezielle Zusatzprogramme ist das nicht ganz trivial.

Daher habe ich mich entschlossen, meine Batch-Kenntnisse etwas abzustauben und mir ein kleines Batch-Menü zu schreiben. Soweit so gut, aber dann hatte ich Blut geleckt. Die erste Version mit "fest verdrahtetem Menü" war schnell geschrieben. Und dann fing es an, interessant zu werden:

  • Da könnte man doch was mit besserer Optik machen.
  • Wenn man die Variablen in einem Block definiert, minimiert man die Fehlerträchtigkeit bei Änderungen.
  • Wenn sich die anzuzeigenden Texte ändern, soll sich die Gestaltung des Menüs selbsttätig korrigieren.
  • Das Menü soll sich selbsttätig an sich ändernde Menüpunkte (Text und Anzahl) anpassen.
  • Der Code sollte nach Möglichkeit keine Mehrfach-Wiederholungen nahezu identischer Codezeilen enthalten.
  • Und wenn wir schon dabei sind, wäre es schön, wenn man am eigentlichen Menü-Batch überhaupt nicht mehr herumbasteln müsste und die Festlegungen der einzelnen Menüpunkte in einer ini-Datei treffen könnte.


In PHP hätte ich das ganze tatsächlich schneller zusammengestoppelt. php.net und ich sind mittlerweile gute Bekannte.

Ein Kommandozeilen-Script (also eine Batch) zu erstellen ist für mich so was von lange her! Damals mit MS-DOS, DR-DOS oder NT-DOS und den ganzen Hilfstools wie 4dos oder 4nt von jpsoftware habe ich Mitte der 1990er ganze Tools geschrieben. Diese Tools laufen unter Windows 10/11 natürlich nicht mehr. Also zusehen, dass es mit der Windows-Kommandozeile klappt!

Genug der Vorrede, ran ans Werk!
Ich möchte gar nicht schildern, wie ich zu dem folgenden Ergebnis gekommen bin. Schaut euch die Batch an. Wenn die Kommentare nicht ausreichen, fragt per E-Mail nach. Es könnte aber gut sein, dass ich dann schon wieder vergessen habe, was Ihr wissen möchtet. (Ich bitte in dem Fall um Geduld.)

So sieht es mit 14 Menüpunkten aus (Anzeigetexte sind ein Beispiel und werden in der INI-Datei festgelegt):

Fertig ausgegebenes Batch-Menü

Hinweis: Unten in Zeile 16 steht: set blank_1=        mit insgesamt 125 Leerzeichen, die werden jedoch von der Function, die die Datei in den Content einbindet, abgeschnitten.
In einzelnen Zeilen werden mehrfache Leerzeichen durch ein einzelnes Leerzeichen ersetzt. Die Dateien im Download enthalten die richtige Anzahl Leerzeichen.

NameGrößeÄnderungsdatumHits
Datei5 KB06.10.2022 09:028
Datei2 KB04.10.2022 21:529
 

Dateiname: ./userfiles/downloads/tools-addons/menuscript/Serverstart.bat

@echo off
rem INI-Startserver.bat: Beschreibung des Aufbaues
rem Definition der Werte-Trippel: Domain-/Servername Serverroot Startprogramm
rem 1. Variable = domain_# | 2. Variable = server_# | 3. Variable = starte_# | das # steht für eine fortlaufende Zahl je Trippel
rem
:restart
cls
rem Ausgabe des Warte-Textes in einer Zeile ohne diese mit Zeilenumbruch abzuschließen.
rem set /p wartet auf ein ENTER, das durch pipelining von echo erzeugt wird.
rem Dadurch wartet die Eingabeaufforderung nicht mehr auf eine Eingabe.
echo.|set /p =Einen Moment bitte, ich bereite mich vor.
rem Wird für die "call set..." - Aufrufe benötigt.
setlocal enableextensions enabledelayedexpansion
rem Definition von Grafikelementen
set line_1=_____________________________________________________________________________________________________________________________
set blank_1=
rem Definition von Zählern
set max_domain=0
set max_server=0
set max_count=0
Set _File=Serverstart.ini
Set /a _Lines=0
rem find "" /v /c = "" sucht nach nichts, /v zeigt nur die Zeilen ohne Suchtreffer, /c zeigt nur die Zeilen mit Suchtreffer
rem Es wird also jede Zeile eingelesen und nichts angezeigt, dafür aber der Zeilenzähler hochgezählt.
For /f %%j in ('Find "" /v /c ^< %_File%') Do Set /a _Lines=%%j
rem Jeder Menüeintrag hat drei Zeilen in der INI-Datei, daher Zeilenzahl/3 = Anzahl den Menüpunkte
set /a max_count=(%_Lines%)/3
rem Werte aus dem INI-File einlesen
rem Delimeter ist das Zeilenende: "delims="
rem Jede Zeile wird per %%a in die Anweisung set .... eingesetzt
for /f "delims=" %%a in (%_File%) do set %%a
rem Schleife zur Bestimmung der max. Länge des Servernamens und der max. Länge des Serverpfades.
set _count=0
:schleife
set /a "_count+=1"
rem Verwenden des Zählers _count als Index für den indirekt angegebenen Variablennamen
call set "_dom=%%domain_!_count!%%"
rem Die Subroutine :strlen1 gibt die Länge des Strings in der Variablen _strlen zurück.
Call :strlen1 %_dom%
if "%_strlen%" gtr "%max_domain%" (set max_domain=%_strlen%)
call set "_serv=%%server_!_count!%%"
Call :strlen1 %_serv%
if "%_strlen%" gtr "%max_server%" (set max_server=%_strlen%)
rem Ausgabe des Fortschritts-Balkens. . . . . .
echo.|set /p =.
if %_count% lss %max_count% goto schleife
:weiter
cls
color 1F
:nocheinmal
rem Berechnung der Breite des Menüs
set /a line_length=6+%max_domain%+3+%max_server%+3
rem Erzeugen der obersten Rahmenzeile des Menüs.
call set zeile=%%line_1:~0,%line_length%%%
set zeile= %zeile%
echo %zeile%
rem Erzeugen der 2. (leeren) Zeile des Menüs.
call set zeile=%%blank_1:~0,%line_length%%%
echo ^|%zeile%^|
rem Schleife zur Erzeugung und Ausgabe der einzelnen Menüpunkte.
set _count=0
:loop
set /a "_count+=1"
call set "_dom=%%domain_!_count!%%"
set _dom=%_dom%%blank_1%
call set "_serv=%%server_!_count!%%"
set _serv=%_serv%%blank_1%
rem Ermitteln, ob die fortlaufende Zahl ein oder zweistellig ist.
Call :strlen1 %_count%
if "%_strlen%" lss "2" (
set zeile= %_count% -
) else (
set zeile= %_count% -
)
Call set zeilex=%%_dom:~0,%max_domain%%%
set zeile=%zeile%%zeilex% -
Call set zeilex=%%_serv:~0,%max_server%%%
set zeile=%zeile%%zeilex%
echo ^|%zeile%^|
if %_count% lss %max_count% goto loop
rem Erzeugen der unteren Rahmenzeile des Menüs.
call set zeile=%%line_1:~0,%line_length%%%
echo ^|%zeile%^|
rem Ausgabe der Handlungsaufforderung.
echo.
echo x - exit z - Batch neu starten
echo.
set var="nichts erfasst"
set meldung=" Gib die Nummer des gewuenschten Servers ein: "
set /p var=%meldung%
if "%var%"=="z" goto weiter
if "%var%"=="x" exit
set _count=0
:ifloop
set /a "_count+=1"
if "%var%"=="%_count%" goto doit
if %_count% lss %max_count% goto ifloop
cls
color 4F
echo unzulaessige Eingabe!
goto nocheinmal
:doit
call set "name=%%domain_!var!%%"
call set "rootdir=%%server_!var!%%
call set "befehl=%%starte_!var!%%
echo %name% wird gestartet
setlocal
cd %rootdir%
cd ..
start %befehl%
endlocal
goto weiter
rem -----------------------------------------------
goto:eof
rem Thema: https://ss64.com/nt/syntax-strlen.html
rem Quelle: https://ss64.org/viewtopic.php?t=17
:strlen1
Setlocal EnableDelayedExpansion
Set "_str=%*"
rem Test if empty
if not defined _str Echo String Length = 0 & ENDLOCAL & set _strlen=0&goto:eof
For /l %%g in (0,1,8191) do (
REM extract one character
Set "_char=!_str:~%%g,1!"
REM if _char is empty we are at the end of the string
if not defined _char ENDLOCAL & set _strlen=%%g& goto:eof
)
exit /b
:y
rem Call the function above like this:
set "_teststring=some example string"
Call :strlen1 _teststring
Echo String is %_strlen% characters long
 

Dateiname: ./userfiles/downloads/tools-addons/menuscript/Serverstart.ini

"domain_1=lembach-cmsimple.de"
"server_1=c:\_locale_Server\Provider\1\root\"
"starte_1=c:\_locale_Server\Provider\1\usbwebserver.exe"
"domain_2=subdomain-1.lembach-cmsimple.de"
"server_2=c:\_locale_Server\Provider\2\root\"
"starte_2=c:\_locale_Server\Provider\2\usbwebserver.exe"
"domain_3=subdomain-2.lembach-cmsimple.de"
"server_3=c:\_locale_Server\Provider\3\root\"
"starte_3=c:\_locale_Server\Provider\3\usbwebserver.exe"
"domain_4=subdomain-3.lembach-cmsimple.de"
"server_4=c:\_locale_Server\Provider\4\root\"
"starte_4=c:\_locale_Server\Provider\4\usbwebserver.exe"
"domain_5=subdomain-4.lembach-cmsimple.de"
"server_5=c:\_locale_Server\Provider\5\root\"
"starte_5=c:\_locale_Server\Provider\5\usbwebserver.exe"
"domain_6=subdomain-5.lembach-cmsimple.de"
"server_6=c:\_locale_Server\Provider\6\root\"
"starte_6=c:\_locale_Server\Provider\6\usbwebserver.exe"
"domain_7=subdomain-6.lembach-cmsimple.de"
"server_7=c:\_locale_Server\Provider\7\root\"
"starte_7=c:\_locale_Server\Provider\7\usbwebserver.exe"
"domain_8=leeres Testweb"
"server_8=c:\_locale_Server\Provider\8\root\"
"starte_8=c:\_locale_Server\Provider\8\usbwebserver.exe"
"domain_9=Template krl-3col-flex"
"server_9=c:\_locale_Server\Lokale\a\root\"
"starte_9=c:\_locale_Server\Lokale\a\usbwebserver.exe"
"domain_10=Testweb .htaccess"
"server_10=c:\_locale_Server\Lokale\b\root\"
"starte_10=c:\_locale_Server\Lokale\b\usbwebserver.exe"
"domain_11=CMSimple_xh-master"
"server_11=c:\_locale_Server\Lokale\c\www\"
"starte_11=c:\_locale_Server\Lokale\c\Portable_XH.lnk"
"domain_12=CMSimple_XH-Server"
"server_12=c:\_locale_Server\Lokale\d\www\"
"starte_12=c:\_locale_Server\Lokale\d\Portable_XH.lnk"
"domain_13=lembach-kr.de"
"server_13=c:\_locale_Server\Lokale\e\www\"
"starte_13=c:\_locale_Server\Lokale\e\Portable_XH.lnk"
"domain_14=Experimentserver"
"server_14=c:\_locale_Server\Lokale\f\root\"
"starte_14=c:\_locale_Server\Lokale\f\usbwebserver.exe"
 

Bei der Recherche für diese Batch bin ich auf dieses Tool gestoßen:

https://www.robvanderwoude.com/battech_batcodecheck.php - Check your batch files with BatCodeCheck

Überprüfen Sie Ihre Batch-Dateien mit BatCodeCheck

BatCodeCheck ist ein einfaches Tool, das Ihre Batchdateien auf häufige Fehler und "schlechte Praktiken" überprüft.
Es zeigt den Quellcode der Batch-Dateien an, hebt Kommentare, ECHO-Text und mehr hervor und fügt Warnungen oder Fehlermeldungen zu Zeilen hinzu, die "zweifelhaften" oder "verdächtigen" Code enthalten.
Unterhalb des hervorgehobenen Codes wird eine Zusammenfassung der Ergebnisse angezeigt.
Sie sollten den Quellcode selbst untersuchen und die Ergebnisse von BatCodeCheck nur zur Orientierung nutzen.
Da einige Fehler nur einmal gemeldet werden, sollten Sie BatCodeCheck für die Batchdatei erneut ausführen, nachdem Sie die Warnungen untersucht und etwaige Fehler behoben haben.

BatCodeCheck ist aus BatHL hervorgegangen, das Batchdateien durch Hervorhebung des Quellcodes "lesbarer" machen sollte.
Die Entwicklung von BatHL wurde eingestellt.

 


| Seitenanfang |