# Kurzes einfaches Batch Script



## kikyou2 (26. September 2012)

Hi zusammen,

ich habe eigentlich nur eine kurze (An)Frage. Ich habe ein sehr kurzes Autoit Script welches ich einfach als Batch Script brauche. Viel macht das Script nicht aber das reicht 


```
WinClose("ArmA 2 OA Console version 1.62 : port 2302", "")
Sleep (30000)
Run("C:\SERVER\DE 2471\arma 2 operation arrowhead\DE 2471.bat", "")
Exit
```

WinClose schließt das Fenster "ArmA 2 OA Console version 1.62 : port 2302" dann wartet das Script 30 Sekunden und starten diese Bat "C:\SERVER\DE 2471\arma 2 operation arrowhead\DE 2471.bat". Danach soll sich das Fenster schließen da das Script automatisch alle 6 Stunden gestartet wird.

Im Prinzip brauche ich also nur eine "Übersetzung" 

Vielen Dank im Voraus!

Mfg kikyou2


----------



## DarkMo (26. September 2012)

is das nich selbsterklärend? vorallem, nachdem dus ja schon selbst nochma beschrieben hast? xD


----------



## kikyou2 (26. September 2012)

Sind die Batch Script Befehle deckungsgleich mit den Autoit Befehlen?

Kenne mich mit den Batch Befehlen nicht aus und habe daher nur mein Autoit Script gepostet.


----------



## DarkMo (26. September 2012)

achsoooo. dein code is dieses auto dongsbums. ach jetz raff ich das ^^ gibts keine batch dokumentation? also run kenn ich von batch her auch. hmm


----------



## bingo88 (26. September 2012)

Programme schließen müsste mittels taskkill funktionieren: taskkill /f /im app.exe
Die Syntax für Fensternamen ist etwas fummelig, evtl. ist das mit dem Anwendungsnamen einfacher zu realisieren.

Sleep gibt es AFAIK so nicht in Batch, zumindest nicht für Windows < Win7. Da geht das mit timeout /T10 /nobreak, T10 = warte 10 Sekunden, /nobreak = nicht durch Tastendruck abbrechbar

Run ist einfach, einfach den Pfad mit vorangestelltem START aufrufen, z. B. START "C:\Programme\Test 1\Test1.exe"
Ob du EXIT brauchst, weiß ich momentan nicht, hängt davon ab, ob die Konsole offen bleibt. Musst du einfach mal ausprobieren.


----------



## kikyou2 (26. September 2012)

bingo88 schrieb:


> Programme schließen müsste mittels taskkill funktionieren: taskkill /f /im app.exe
> Die Syntax für Fensternamen ist etwas fummelig, evtl. ist das mit dem Anwendungsnamen einfacher zu realisieren.



Geht leider nicht da es hierbei um mehrere Server geht die gleichnamige .exen Starten. Arbeite ich da mit taskkill killt er alle Server aufeinmal was er eben nicht soll. Daher war ich auf die Autoit Version gewechselt um per Fensternamen killen zu können der immer gleich ist und sich nur über den Gameport ändert pro Server.

Wie lautet denn der Befehl für killen mit Fensternamen? Evtl. krieg ich das ja damit hin 



bingo88 schrieb:


> Sleep gibt es AFAIK so nicht in Batch, zumindest nicht für Windows < Win7. Da geht das mit timeout /T10 /nobreak, T10 = warte 10 Sekunden, /nobreak = nicht durch Tastendruck abbrechbar




```
ping -n 31 127.0.0.1>nul
```

Ginge das nicht auch einfach mit diesem Befehl?



bingo88 schrieb:


> Run ist einfach, einfach den Pfad mit vorangestelltem START aufrufen, z. B. START "C:\Programme\Test 1\Test1.exe"
> Ob du EXIT brauchst, weiß ich momentan nicht, hängt davon ab, ob die Konsole offen bleibt. Musst du einfach mal ausprobieren.


 
Alles klar das hilft! 

Vielen Dank schon mal!

Mfg kikyou2


----------



## MaNT1S (26. September 2012)

andere Frage:
Warum nicht mehr mit AutoIT ?


----------



## bingo88 (26. September 2012)

taskkill /f /fi "Windwowtitle eq <titel>" /im <appname> wenn ich die verlinkte Doku richtig verstanden habe. Killt also alle Anwendungen vom Typ <appname> deren Fenstertitel <titel> lautet.

Das sleep mit ping emulieren geht auch, hab's halt nicht erwähnt weil ich es unschön finde


----------



## kikyou2 (26. September 2012)

MaNT1S schrieb:


> andere Frage:
> Warum nicht mehr mit AutoIT ?



Weil es sich hier um Arma 2 Server mit dem DayZ Mod handelt. Diese Server habe ich mit Ibattle ausgestattet und mit Hilfe einer Scheduler.xml ein Script erstellt mit dem Ingame dann vor dem nächsten Restart mehrmals gewarnt wird und dann zu bestimmten Uhrzeiten das hier behandelte Restart Script startet. Scheinbar kann der Scheduler aber keine .exe starten und mit .bat gab es da bisher kein Problem (bspw. mit einem Server per taskkill). Daher will ich jetzt zu einer Batch zurück 



bingo88 schrieb:


> taskkill /f /fi "Windwowtitle eq <titel>" /im <appname> wenn ich die verlinkte Doku richtig verstanden habe. Killt also alle Anwendungen vom Typ <appname> deren Fenstertitel <titel> lautet.
> 
> Das sleep mit ping emulieren geht auch, hab's halt nicht erwähnt weil ich es unschön finde


 
Ich probier es mal, dickes Danke an dich! 

wg. Ping alles klar


----------



## Profikuehl (26. September 2012)

Wozu benötigst du das eigentlich? Hat ja bestimmt was mit DayZ zu tun 

Edit: ein paar Sekunden zu spät sry.


----------



## MaNT1S (26. September 2012)

alternativ könntest du auch über die ProzessID (PID) gehen

evtl sowas in der Richtung:



@echo off
REM Liste der Prozesse VOR dem Start
tasklist /V>%temp%\PIDs_vor.txt
start calc.exe

REM Liste der Prozesse NACH dem Start
tasklist /V>%temp%\PIDs_nach.txt


REM Beide Listen vergleichen und die neue PID auslesen
for /F "tokens=2 delims= " %%a in ('fc %temp%\PIDs_vor.txt %temp%\PIDs_nach.txt^|find "calc.exe"') do set PID=%%a

REM Temp Dateien löschen und PID in Datei speichern
del %temp%\PIDs_vor.txt 
del %temp%\PIDs_nach.txt
echo %PID% >%temp%\pid.txt


REM PID aus Datei auslesen und Task schließen



for /f %%i in (%temp%\pid.txt) do (
set PID=%%i
)
echo %PID%
taskkill /pid %PID%


----------



## Profikuehl (27. September 2012)

MaNT1S schrieb:


> alternativ könntest du auch über die ProzessID (PID) gehen
> 
> evtl sowas in der Richtung:
> 
> ...


 
Ist zwar schön aber doch viel zu aufwendig? Mit taskkill sollte das  ja klappen. 
Warum kannst du in deinem Task Sheduler keine Exe starten? Sollte eigentlich funktionieren, evtl. Mal die Berechtigungen oder den ausführenden User prüfen .


----------



## retarDeD.aNiMaL (27. September 2012)

Oder machst ne .bat welche die .exe startet


----------



## Low (28. September 2012)

retarDeD.aNiMaL schrieb:


> Oder machst ne .bat welche die .exe startet


 Das wollte ich grade auch schreiben als ich die Erste Seite gelesen habe


----------



## kikyou2 (1. Oktober 2012)

retarDeD.aNiMaL schrieb:


> Oder machst ne .bat welche die .exe startet


 
Genau darauf bin ich jetzt mittlerweile auch gekommen und so habe ich es auch gelöst.

Schon blöd das ich da nicht eher drauf gekommen bin 

Mit Windowtitle hat es leider nicht funktioniert aber so wie es jetzt ist funktioniert es, auch wenn es evtl. nicht ganz so "schön" ist 

Danke für die Hilfe @all


----------



## kikyou2 (1. Oktober 2012)

Hmm scheinbar schafft Scheduler.xml auch das nicht. Daher habe ich mir überlegt soll er über den Scheduler nur die Warnungen ausgeben (funktioniert) und ein Autoit Script restartet die Server immer von alleine.

Das hier hab ich mir ausgedacht/im Netz zusammengesucht 


```
While 1
    $sTime = _Time(2) & ":" & @SEC
    Select
        Case $sTime = "02:00:00"
            _restart3()
        Case $sTime = "04:00:00"
            _restart2()
        Case $sTime = "06:00:00"
            _restart1()
	Case $sTime = "08:00:00"
            _restart3()
        Case $sTime = "10:00:00"
            _restart2()
        Case $sTime = "12:00:00"
            _restart1()
	Case $sTime = "14:00:00"
            _restart3()
        Case $sTime = "16:00:00"
            _restart2()
        Case $sTime = "18:00:00"
            _restart1()
	Case $sTime = "20:00:00"
            _restart3()
        Case $sTime = "22:00:00"
            _restart2()
        Case $sTime = "00:00:00"
            _restart1()
    EndSelect
    Sleep(50)
WEnd

Func _Time($pre)
    If $pre = 1 Then
        Return @HOUR
    ElseIf $pre = 2 Then
        Return @HOUR & ":" & @MIN
    ElseIf $pre = 3 Then
        Return @Hour & ":" & @Min & ":" & @SEC
    EndIf
EndFunc ;==>_Time($pre)

Func _restart1()
	WinClose("ArmA 2 OA Console version 1.62 : port 2302", "")
	Sleep (30000)
	Run("C:\SERVER\DE 2471\arma 2 operation arrowhead\DE 2471.bat", "")
EndFunc

Func _restart2()
	WinClose("ArmA 2 OA Console version 1.62 : port 2308", "")
	Sleep (30000)
	Run("C:\SERVER\Offizielle DayZ Privat Server\Sons Of Anarchy #2 Chernarus Server\dayz_server.bat", "")
EndFunc

Func _restart3()
	WinClose("ArmA 2 OA Console version 1.62 : port 2309", "")
	Sleep (30000)
	Run("C:\SERVER\Offizielle DayZ Privat Server\Sons Of Anarchy #3 Lingor Island Server\dayz_lingor_server.bat", "")
EndFunc
```

Problem jetzt nur wenn das Script die .bat startet kommt immer folgende Fehlermeldung:




			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        



Wenn ich die Funktion an sich nur als einfaches Script nehme, also:


```
WinClose("ArmA 2 OA Console version 1.62 : port 2309", "")
	Sleep (30000)
	Run("C:\SERVER\Offizielle DayZ Privat Server\Sons Of Anarchy #3 Lingor Island Server\dayz_lingor_server.bat", "")
```

Und dieses dann manuell starte funktioniert es ohne Probleme. Jemand eine Ahnung woran das liegen könnte?

Mfg kikyou2

Edit: Lösung gefunden hat sich erledigt. Dadurch das das Autoit Script nicht im Verzeichnis lag wo die bat liegt und diese sich direkt auf das Verzeichnis bezogen hat konnte sie die Dateien nicht finden. 

Ein einfaches CD Pfad der bat hat gereicht


----------

