max5moritz
Goto Top

Per Bat-File Programm starten und nach einer bestimmten Zeit wieder beenden

Servus und Frohe Pfingsten,

ich bitte um Eure Mithilfe, Danke im Voraus.

ich möchte per BAT den VLC starten und nach einer Zeitvorgabe, kann zwischen 5 min und 1 - 2 stunden liegen, wieder beenden.
Der Aufruf ist ja per Taskmanager möglich. Warum dann BAT? Weil ich die Parameter dann flexibel übergeben kann.
Hier mein Entwurf:

@echo off
set Ziel=%2
set Name=%3
if "n"=="n%2" goto mf1  
if "n"=="n%3" goto mf1  
goto m%1

:m1
start /w C:\Video\VLC\vlc.exe -vvv http://www.dradio.de/streaming/dlf.m3u --sout file/ps:D:\Medien\Audio\Radio\%ziel%\%name%.ps
if not "n"=="n%4" ping -n %4 127.0.0.1 > NUL  
if "n"=="n%4" goto ende  
taskkill /F /IM vlc.exe
goto ende

:m2
start C:\Video\VLC\vlc.exe -vvv http://gffstream.ic.llnwd.net/stream/gffstream_w19a --sout file/ps:D:\Medien\Audio\Radio\%ziel%\%name%.ps
if not "n"=="n%4" ping -n %4 127.0.0.1 > NUL  
if "n"=="n%4" goto ende  
taskkill /F /IM vlc.exe
goto ende

:mf1
echo Ein Parameter fehlt, das Programm wurde beendet
pause

:ende
cls
exit

Was sicher nicht wirklich gut gelöst ist, ist der Timer via ping
Für kurze Zeiten (bis 5 min) vielleicht eine Lösung, doch für 1 - 2 Stunden? Delay habe ich probiert, geht aber nicht.
Auch sollten die goto m%1 durch ein Schleifchen ersetzt werden, da dort eigentlich wieder eine Liste im Aufbau wie folgt:

#EXTINF:1,MDR Jump
http://c22033-l.i.core.cdn.streamfarm.net/22004mdrjump/live/3087mdr_jump/live_de_128.mp3
#EXTINF:2,Deutschlandfunk
http://dradio.ic.llnwd.net/stream/dradio_dlf_m_a

zum Einsatz kommen soll. Nur soll diesmal nur ein Zeilenpaar gefunden und ausgewertet werden, wobei der Parameter %1 die Zahl hinter #EXTINF: sein soll.

Da VLC sich nur widerwillig beenden läßt, deshalb der taskkill-Befehl.
Für den Fall das Parameter %4 absichtlich vergessen wurde, dient die Abfrage in Zeile 11 / 18:
Dann läuft der VLC bis ultimo oder die Festplatte überquillt face-wink

Für Anregungen und Hilfestellungen danke ich jetzt schon.

So long
max5moritz

Content-ID: 143417

Url: https://administrator.de/contentid/143417

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

bastla
bastla 23.05.2010 um 22:28:42 Uhr
Goto Top
Hallo max5moritz!

Eine elegantere Pause lässt sich mit der "sleep.exe" aus den Windows Server 2003 Resource Kit Tools erzeugen ...
Wie soll denn die "Auswertung" des Zeilenpaares erfolgen? Das Auslesen lässt sich etwa so umsetzen:
set "Liste=D:\Medien\Audio\Radio\Playlist.txt"  

set "ZeilenNr="  
for /f "delims=:" %%i in ('findstr /b /n "#EXTINF:%1," "%Liste%"') do set /a ZeilenNr=%%i-1  
if not defined ZeilenNr echo Zeile %1 nicht gefunden! & goto :eof

set "Z1=" & set "Z2="  
for /f "delims=" %%i in ('more +%ZeilenNr% "%Liste%"') do if not defined Z2 call :ProcessLine "%%i"  

echo Hier weitere Verarbeitung von "%Z1%" und "%Z2%" ...  
goto :eof

:ProcessLine
if not defined Z1 (set "Z1=%~1" & goto :eof)  
if not defined Z2 set "Z2=%~1"  
goto :eof
Grüße
bastla

P.S.: Ein "exit" ist eigentlich nur mit einem "/B" (was hier aber vermutlich nicht benötigt wird) sinnvoll (und ansonsten beim Testen nur lästig) - gezielt beenden lässt sich ein Batch auch mit "goto :eof" ...
max5moritz
max5moritz 23.05.2010 um 23:56:14 Uhr
Goto Top
Danke! Super! Genauso sollte es sein! face-smile

Wie bekomme ich den blauen Teil #EXTINF_1,MDR Jump_test1 aus dem Dateinamen?

Grüße
m5m
bastla
bastla 24.05.2010 um 00:01:26 Uhr
Goto Top
Hallo m5m!

Soferne Du (vermutlich) auch das Komma nicht benötigst, einfach so:
for /f "tokens=1* delims=," %%i in ("%Z1%") do set "Titel=%%j"
- bei Bedarf könntest Du das Komma aber natürlich in das Ergebnis auch wieder "einbauen":
for /f "tokens=1* delims=," %%i in ("%Z1%") do set "Titel=,%%j"
Grüße
bastla
77559
77559 24.05.2010 um 11:27:05 Uhr
Goto Top
Zitat von @bastla:
[OT]
P.S.: Ein "exit" ist eigentlich nur mit einem "/B" (was hier aber vermutlich nicht benötigt wird)
sinnvoll (und ansonsten beim Testen nur lästig)
- gezielt beenden lässt sich ein Batch auch mit "goto :eof" ...

In diesem Fall stimme ich dir zu bastla,
aber wenn in einer Sub eine Abbruchbedingung festgestellt wird, nützt Goto :Eof nichts.
Dort kann man Exit aber schön benutzen um über die Rückgabe eines Errorlevels den
Hauptbatch zum Beenden/andere Aktion zu veranlassen.
::Example.cmd:::::::::::::::::::::::::::::::::::::::::::::::::
@echo off&setlocal
for %%A in (one two fail three) do call :sub %%A||goto :abort
:abort
goto :eof
:sub
echo %1
set retErr=0
if "%1" EQU "fail" set retErr=1  
exit /B %retErr%
::Example.cmd:::::::::::::::::::::::::::::::::::::::::::::::::
[/OT]

Gruß
LotPings
60730
60730 24.05.2010, aktualisiert am 18.10.2012 um 18:42:15 Uhr
Goto Top
Servus,

Biber hat mal einen kleineren Exkurs in Sachen AT Steuerung geschrieben, den solltest du dir mal ansehen.

Im Prinzip mußt du den nur um einen doppelten Tasklist erweitern, um die PID der gerade gestarteten VLC Instanz zu erkennen und diese Instanz dann mit Bibers AT Bausatz "kicken".
Andernfalls kickst du ja den zuerst gefundenen VLC - nicht den, den du grade kicken willst (wenn mehrere VLC aktiv sind).

Gruß

edit:

Suchst du nach Biber at Batch kommt der als erster Treffer.

AT Job zu einem beliebigen (unbekannten) Zeitpunkt in Minuten per Script starten
@Biber: du solltest dir die batch.com besorgen, die ist anscheinend frei - Biber@batch.com - was ne aussagekräftige emilie face-wink
bastla
bastla 24.05.2010 um 12:59:23 Uhr
Goto Top
@77559
[OT]
... Rückgabe eines Errorlevels ...
Das war mit meinem (etwas verkürzten) ... nur mit einem "/B" ... gemeint ...
{/OT]

Grüße
bastla
max5moritz
max5moritz 25.05.2010 um 10:27:43 Uhr
Goto Top
@alle
Danke für die tollen Ergänzungen. Das mit dem taskkill hatte ich mir schon überlegt. Da kann ich die PID gut gebrauchen. Für alle die einen Timer in einer Batch brauchen, folgende Lösung, gefunden By nero-chrischi, ein wenig modifiziert von mir, da ich davon ausgehe, dass der Timer per call öfter gebraucht wird:
@echo off
if exist %pd%wait%1.vbs goto end
echo Option Explicit > %pd%wait%1.vbs
echo Dim Progr, Zeit, i, oArgs >> %pd%wait%1.vbs
echo set oArgs    = Wscript.Arguments >> %pd%wait%1.vbs
echo For  i = 0 to oArgs.Count - 1 >> %pd%wait%1.vbs
echo If i = 0 Then Zeit      =         oArgs.item(i) >> %pd%wait%1.vbs
echo Next >> %pd%wait%1.vbs
echo If InStr( Zeit, "." ) Then Zeit = Left( Zeit, InStr( Zeit, "." ) -1 ) >> %pd%wait%1.vbs  
echo If InStr( Zeit, "," ) Then Zeit = Left( Zeit, InStr( Zeit, "," ) -1 ) >> %pd%wait%1.vbs  
echo On Error Resume Next >> %pd%wait%1.vbs
echo Zeit = Zeit / 10*10 >> %pd%wait%1.vbs
echo On Error GoTo 0 >> %pd%wait%1.vbs
echo WScript.Sleep Zeit*1000 >> %pd%wait%1.vbs
echo If Progr = "" Then WScript.Quit >> %pd%wait%1.vbs  
echo WScript.CreateObject("WScript.Shell").Run Progr >> %pd%wait%1.vbs  
:end

rem   ------------------------------------------------------
rem   .-'Nun die Befehle'-.  
rem   Die Zahl nach der %pd%wait%1.vbs sind die wartenden Sekunden
rem   Keine Zahl Bedeuten ca. 0.1 Sek
rem   ------------------------------------------------------

echo   Das Programm %1 läuft noch, bitte warten ...
echo.
echo   Timer ist nach %2 s abgelaufen!
echo.
%pd%wait%1.vbs %2
cls
del %pd%wait%1.vbs
goto :eof

Die Parameter %pd% und %1 sowie %2 werden von der aufrufenden Batch übergeben.
Der erste übernimmt den Pfad von der aufrufenden Batch, falls man die Batch per Task-Planer starten möchte,
der Zweite macht den Timer unterscheidbar, nicht das nachher ein weiterer Aufruf den ersten killt und %2 legt die Laufzeit in Sekunden fest.

Das Problem ist also gelöst, Danke nochmals und

So long,
max5moritz