Start/Stop.bat schreiben und verwenden [Windows]

Aktuell führen wir noch einige Anpassungen durch, das Forum wurde jedoch bereits live geschaltet.
  • Moin zusammen :)


    Da ich keinen direkten Beitrag zur Start und stop.bat gefunden habe, habe ich mich mal ran gesetzt um eine Erklärung dazu zu schreiben :) Die verwendeten variablen sind anpassbar und die .bat-Datei vielseitig einsetzbar.


    Warum ein Tutorial ?

    Ich kannte mich bis vor kurzem nicht damit aus und musste mich erst einmal damit beschäftigen, was für den leihen im Start seiner Karriere sicherlich nicht so einfach ist. Soviel zum Vorwort ;)


    Fangen wir an.

    Wie nenne ich meine Datei?

    Zur Übersicht habe ich meine Datei "Spiel"start.bat (armastart.bat) genannt. Für CS:GO würde ich sie "csgostart.bat" nennen. Das kann man aber gestalten wie man möchte :) Also gehst du wie folgt vor:
    1. Text Dokument auf dem Desktop anlegen
    2. Dieses per rechtsklick anwählen Un umbenennen (bei mir armastart.bat)
    3. Datei rechtsklicken und bearbeiten wählen


    Jetzt hat sich bei dir ein Textfenster geöffnet. Sieht ein wenig leer darin aus. Das musst du ändern ! Aber wie?

    Wie füllst du deine Start Datei?


    Eine Start.bat muss die Server Prozess-Id lesen und Speichern können. Das dient zum späteren beenden des Servers und ist wichtig für die my_stop.bat ;) Hier die Zeilen dazu:


    Bash: armastart.bat
    SET mypath=%~dp0
    
    
    for /f "tokens=2 delims==; " %%a in (' wmic process call create "%mypath:~0,-1%\armalll\arma3server_x64.exe -port=%1" ^| find "ProcessId" ') do set PID=%%a
    
    
    echo %PID% > pid.txt


    was bedeutet das ??...


    Wird hier wohl deine erste Frage sein. Ich habs am Anfang auch nicht verstanden, ist aber relativ easy ;) Zur Erklärung


    Wir fangen oben an:
    "Set mypath=" ist eine leere variable die ich mit einem Wert fülle.
    "%~dp0" ist dieser Wert und gibt mir den Ordner aus , indem sich diese .bat befindet.


    Ab hier gibt's ne kleine Pause für dich ..
    ..
    ..
    ..


    Weiter geht's ;)


    Den Rest zerpflücke ich jetzt nicht aber fasse in kurz zusammen. Er startet den Server, liest die tasklist (Prozessliste) aus und schnappt sich den neusten Prozess mit dem passenden imagename (Anwendungsname).... puhhh, ganz schön viel theorie...


    Zuletzt schnappt er sich die Prozess-ID und speichert sie in selben Ordner wie die .bat Datei in die Datei pid.txt :) Fertig ist das startscript :)


    Aber Moment ... Manche spiele benötigen doch Startparameter. ...


    Wie Startparameter angeben ?


    Wenn du genau hinschaust, siehst du oben hinter meiner arma3server_x64.exe ein "-port=%1". Was -port bedeutet ist wahrscheinlich klar .. Aber das %1 ?


    %1 ist ein parameter, den ich an die armastart.bat übergeben habe.


    Wie habe ich das gemacht ?


    GAnz einfach. Bei jedem Gameserver kann man den Starbefehl angeben. Dieser sieht bei mir so aus:


    armastart.bat gsport


    Und das wars .. Die Parameter können natürlich erweitert werden. Würde ich jetzt noch die Spieler mit angeben wollen sieht mein Befehl wie folgt aus :


    armastart.bat gsport gsplayer


    In meiner armastart.bat könnte ich dann %1 für den Port und %2 für die Spieler verwenden. Also eigentlich ganz einfach :)


    Wir stoppst du jetzt den Server?


    Auch total einfach ;) diesmal heißt die Datei aber "my_stop.bat". Diese können wir nicht umbenennen. Sie liegt im selben Verzeichnis wie die armastart.bat, muss allerdings nicht deklariert werden, da sie in TekBase so hinterlegt ist. Ihr Inhalt könnte wie folgt aussehen :



    Bash: my_stop.bat
    @echo off
    for /f %%i in (pid.txt) do (
    set PID=%%i
    )
    echo %PID%
    taskkill /f /pid %PID%
    del pid.txt


    Hier wird die pid.txt mit der gespeicherten Prozess-ID ausgelesen und der Prozess beendet, sowie die pid.txt gelöscht.


    Das wars eigentlich soweit :)
    Ich hoffe ich konnte dir helfen.
    MfG Crossi

  • Das Ding mit der Pid in eine Textdatei schreiben ist eine relativ träge Angelegenheit, hat jemand einen zu schnellen Finger und klickt mehrmals auf Serverstart, kann es sein, das da schon die Probleme anfangen. Daher bevorzuge ich die Methode die Pid direkt beim Serverstart / Stop aus der Tasklist zu lesen. Damit ist auch sichergestellt das zu der Zeit auch wirklich ein Prozess mit der Pid existiert und es kann kein Löschwütiger, wie es schon ab und zu mal vorkommt die pid.txt löschen.


    Damit bist Du eigentlich von irgendwelchen Prozess Aufzeichnungen in txt oder XML unabhängig und sagst dem System nur "gib mir die Pid welche die exe "xyz.exe" im Verzeichnis "abc " verursacht. mit der Art und Weise kannst Du die Startbatch auch absichern das kein Prozess von der gleichen Exe doppelt gestartet wird oder das der Server nicht starten kann wenn Steamcmd läuft.



    Code
    SET var=%~dp0
    SET line=%var%
          SETLOCAL ENABLEDELAYEDEXPANSION
          ECHO !line:\=\\
          ENDLOCAL
          set vara=!line:\=\\!
        for /f "usebackq tokens=2 delims==" %%a in (`wmic process where ^(ExecutablePath^="%vara%ShooterGame\\Binaries\\Win64\\ShooterGameServer.exe"^) get processid /value`) do (
        set PID=%%a   
        )


    Absicherung wenn z.b SteamCMD läuft


    GamerzHost.de Logo

    Einmal editiert, zuletzt von gamerzhost.de ()

  • Funktioniert wunderbar,Danke!! Könnte man die Start.bat auf die Minecraft Server anwenden? Ich bekomme es nicht gebacken mit der Anpassung (Java Pfad) Wäre supi wenn Du mir da unter die Arme greifen könntest! :)

  • Code
    SET mypath=%~dp0for /f "tokens=2 delims==; " %%a in (' wmic process call create "%mypath:~0,-1%\arma3server_x64.exe -port=%1" ^| find "ProcessId" ') do set PID=%%aecho %PID% > pid.txt

    Bekomme permanet Cannot start host on port 0.




    Code
    arma3start.bat -port gsport -config=server.cfg -cfg=basic.cfg -mod=@extDB3 -mod=@life_server -mod=@Sperrzonensystem
  • Also ich würde sagen das -port %1 ist und gsport %2 -config=server.cfg ist dann %3 gerade weil -port gsport nicht -port=gsport heißt sind es zwei Werte. Du kannst aber mal -port rauslassen gehts dann? Den dann wäre gsport wieder der erste Parameter

    Bitte die Forumsuche und das Handbuch verwenden. Wenn die Suche erfolglos war, bitte ein Thema erstellen und das Problem ausführlich beschreiben. Dieser Ablauf spart Zeit und unnötige Fragen zu immer gleichen Problemen. Sie können aber auch im Kundenbereich ein Support-Ticket erstellen.


    Gefällt Ihnen TekLab? facebook-1.pngtwitter-1.pnglinkedin-1.png

  • Falls jemand Interesse hat meine Arma3 Start bat für den privaten Gebrauch. Autoupdate is auch gleich drinnne. Muss nur noch ne Möglichkeit finden wie ich das mit den Mods mache


    • Hilfreich

    My worked fix for start.bat multiple instance (tekbase8.6.13 & windows server2019 ent edition x64)


    start.bat :

    Code
    set cmdcount="wmic process where name="ROK.exe" | find "ROK.exe" /c"
    FOR /F "tokens=*" %%i IN (' %cmdcount% ') DO SET X=%%i
    
    IF %x%==2 GOTO resume exit
    
    SET mypath=%~dp0
    for /f "tokens=2 delims==; " %%a in (' wmic process call create "%mypath:~0,-1%\ROK.exe -batchmode -nographics -port=%1" ^| find "ProcessId" ') do set PID=%%a
    echo %PID% > pid.txt


    &

    my_stop.bat


    Code
    @echo off
    for /f %%i in (pid.txt) do (
    set PID=%%i
    )
    echo %PID%
    taskkill /f /pid %PID%
    del pid.txt