Archiv verlassen und diese Seite im Standarddesign anzeigen : verzögerung bei batchdatei programmieren
raytracer
22.06.2016, 09:29
Hi, ich habe ne batchdatei, welche 2 anwendungen startet. wie richte ich ein, dass nach dem start des 1 tools eine kleine verzögerung ist, und dann erst das 2. tool geladen wird? die pause sollte max 1 sekunde sein.
@echo off
start "" "C:\Program Files (x86)\Logitech\LWS\Webcam Software\Launcher_Main.exe"
start "" "C:\Program Files\TeamSpeak 3 Client\ts3client_win64.exe"
Mit einem PAUSE-Befehl kannst du da eine kurze Wartezeit einbinden.
@echo off
echo Das Programm pausiert nach dieser Anzeige
pause
Mit einem PAUSE-Befehl kannst du da eine kurze Wartezeit einbinden.
Wartet pause nicht auf Tastendruck, also quasi ewig?
Alternative könnte
timeout /T 1 > nul
vielleicht das Richtige sein, wartet ca. eine Sekunde lang.
Uff, stimmt afaik.
Die letzte Batchdatei, die ich benutzt/geschrieben habe, war ein einfacher Shutdown, den ich über die Aufgabenplanung starten konnte. §ugly
Alternative könnte
timeout /T 1 > nul
vielleicht das Richtige sein, wartet ca. eine Sekunde lang.
Ist mir zuerst auch so in den Sinn gekommen. Allerdings soll die Auflösung, wie du sagtest, tatsächlich nur ungefähr 1 Sekunde betragen, wobei angeblich auch sehr viel weniger möglich ist (nicht selbst nachgemessen), was dieses Tool, zumindest theoretisch, innerhalb dieser Größenordnung disqualifizieren könnte. Es dürfte sich also eher um einen Minutentimer handeln. Gut, bei Spielkram, worum es hier gehen dürfte, kann man ein Fehlschlagen vielleicht mal hinnehmen, weshalb es erwähnenswert bleibt. Aber ärgerlich ist das Verhalten von Microsoft dennoch.
Dass man bei Microsoft kein Interesse an gescheiten Tools hat, haben sie leider zur Genüge dokumentiert. In dieses Bild passt leider auch, dass man ausgerechnet mit einem erst spät eingeführten Tool wie diesem nichts allgemein Taugliches eingebracht hat, weshalb man wieder eine Chance versemmelt hat. Es ist und bleibt wohl ein Krampf mit deren Einstellung.
Genauere Alternativen, ungefähr mit Millisekundenauflösung, wobei die praktisch erzielbare Genauigkeit vom verwendeten Timer selbst, von seinem Timerintervall und ggf. von dessen Einstellung bestimmt ist (typisch 1....15,625 ms), wobei diverse Zugriffs- und Ausführungszeiten hinzukommen, weshalb man damit keine Millisekunden festlegen kann, wohl aber wenigstens Sekunden mit genügender Genauigkeit:
Falls das IPv4-Protokoll zur Verfügung steht:
ping 192.0.2.42 -n 1 -w 1000 > nul
Hierbei kommt es darauf an, dass eine Netzwerkadresse gewählt wird, welche, wie hier, definitiv nicht existieren sollte, siehe hierzu RFC3330 (http://tools.ietf.org/html/rfc3330). Der Teil der IPv4-Adresse hinter dem letzten Punkt ist frei wählbar, alles andere nicht, um bei einer inexistenten Adresse zu bleiben. Hinter dem Parameter -w wird die Wartezeit für das Timeout in Millisekunden angegeben. Hinter dem Parameter -n wird angegeben, wieviele Durchgänge erwünscht sind, hier also einer. Mit jedem ping- (http://de.wikipedia.org/wiki/Ping_(Daten%C3%BCbertragung))Berfehl wird ein ICMP-"Echo-Request"-Paket an die angegebene Adresse abgesetzt.
Falls der Windows Script Host zur Verfügung steht:
@echo off
set pauseduration=1000
set program1=notepad.exe
set program2=calc.exe
set sleepscript=%temp%\sleep.vbs
echo WScript.Sleep^(WScript.Arguments^(0^)^) > "%sleepscript%"
start "" "%program1%"
cscript "%sleepscript%" %pauseduration% >nul
start "" "%program2%"
if exist "%sleepscript%" del "%sleepscript%"
Es wird eine temporäre Scriptdatei angelegt, welche nachher gelöscht wird.
Falls der Windows Script Host zur Verfügung steht und die Konsole nervt (m.M.n die bisher eleganteste Lösung):
Dim oShell
Set oShell = CreateObject("Wscript.shell")
oShell.run "notepad.exe"
WScript.sleep 1000
oShell.run "calc.exe"
set oShell = nothing
Das in eine Datei mit dem Namensschema *.vbs speichern und ausführen.
Von Lösungen auf der Grundlage simpler Schleifen, welche in der übrigen Zeit CPU-Takte verbraten, sollte abzuraten sein. Das würde ich nur dann machen, wenn tatsächlich eine Auflösung innerhalb der Timer-Interrupts benötigt wird, was hier fehl am Platz wäre.
Falls das IPv4-Protokoll zur Verfügung steht:
ping 192.0.2.42 -n 1 -w 1000 > nul
Finde ich interessant, dass du gerade die Lösung mit ping vorschlägst. Mir ist der Befehl auch erst eingefallen, weil ich bisher keine andere Möglichkeit kannte, wenn ich in Batchdateien eine Verzögerung haben wollte (normalerweise findet man ja in fast jeder Sprache irgendeinen Befehl aka delay/sleep, der das für einen erledigt, nur die cmd hat´s mal wieder nicht), allerdings habe ich dann vorhin doch noch mal kurz nach anderen Möglichkeiten gesucht und den neueren timeout Befehl gefunden.
Deine Einwände bzgl. der Ungenauigkeit kann ich absolut nachvollziehen und muss auch zugeben, dass ich das im Detail gar nicht betrachtet habe, aber irgendwie stört mich der Gedanke immer noch bei zwei möglichen Lösungen ausgerechnet diejenige zu empfehlen, die eigentlich eher eine "Bastellösung" ist; immerhin war der ping-Befehl sicher nie als Verzögerungsbefehl gedacht, sondern wurde eher mangels guten Tools dafür genutzt, wie du ja schon in anderem Zusammenhang schriebst, während timeout zumindest schon einmal für diesen Zweck geschaffen worden zu sein scheint (allerdings, wenn es wirklich um Millisekunden und nicht nur volle Sekunden gehen sollte, ist es natürlich schon wieder unbrauchbar).
Wahrscheinlich ist dein VB-Script oder allgemein das zurückgreifen auf andere Sprachen/Schnittstellen echt die beste Art, das "sauber" zu lösen, wenn es darauf ankommt.
Lookbehind
22.06.2016, 17:33
Moment ... echt jetzt?
Ich meine, ich hab mich nie viel mit Scripting in der cmd beschäftigt, aber ... Da gibts nichtmal ein simples "sleep"? Wirklich?
Kann ich ja fast nicht glauben.
Moment ... echt jetzt?
Ich meine, ich hab mich nie viel mit Scripting in der cmd beschäftigt, aber ... Da gibts nichtmal ein simples "sleep"? Wirklich?
Kann ich ja fast nicht glauben.
Leider korrekt! Im Windows-API ist natürlich eines vorhanden, aber es ist nicht direkt über die Konsole zugreifbar. Die Konsole ist sozusagen inoffiziell deprecated. Wenn man dort ein Sleep haben will, darf man es sich natürlich kompilieren.
Stattdessen soll man die Powershell-Konsole verwenden, welche selbst eine fürchterliche Bloatware mit elendiger Startzeit ist und dabei natürlich elendig Last produziert. Wenn sie einmal läuft, ist sie sehr, sehr mächtig, da man darüber u.a. sogar Zugriff auf Betriebssystemschnittstellen bekommt! Sie ist nur nicht alltagstauglich und eben unbeliebt, bei mir auch.
Dort ginge es ganz einfach (als *.ps1 speichern):
& "notepad.exe"
Start-Sleep -m 1000
& "calc.exe"
Aber niemand will eben auf den Start dieses monströsen Frachters warten!
Batchdateien zu erstellen, bereitet einem das Gefühl, als ob die Hölle zugefriert, weshalb man das auch nicht will.
Lookbehind
22.06.2016, 17:48
Gabs da nicht iwie für Win10 jetzt ne Linux-Oberfläche mit bash? :grinundwe
Gabs da nicht iwie für Win10 jetzt ne Linux-Oberfläche mit bash? :grinundwe
Wie das nachher aussehen soll, weiß ich zwar nicht, aber solch ein Projekt einer Bash unter Windows 10 wird tatsächlich ernsthaft verfolgt. Bis dorthin verwende ich Cygwin. Aber ich benutze es eher selten.
Gabs da nicht iwie für Win10 jetzt ne Linux-Oberfläche mit bash? :grinundwe
WSL (Windows Subsystem for Linux) liefert eine Bash-Umgebung, ja. Aber es gibt mindestens einen fundamentalen Unterschied gegenüber Cygwin oder SFU: WSL arbeitet mit nativen ELF-Binaries, während Cygwin und SFU das bei Windows übliche PE-Format benutzen. In der Konsequenz heißt das, dass die Linux-Umgebung in sich abgeschottet ist und keine Windows-Programme starten kann (weil die halt das falsche Format haben). Sowas wie der OP hier will, dass die Shell (mit Verzögerung) ein Windows-Programm startet, würde also nicht gehen.
Eigentlich ist es halt nicht für sowas gedacht, sondern damit Webentwickler nicht immer zu Linux rennen, um die vertraute LAMP-Umgebung vorzufinden, die natürlich auch später auf den meisten Servern im Einsatz ist. Selbst da hakt es aber, weil Apache nur mit Mühe zum Start überredet werden kann, Logdateien leer bleiben (es läuft kein halt kein Syslog) und viele andere Sachen (Django, Ruby on Rails, etc.) auch nicht nicht so trivial einzurichten sind.
Außerdem hakt es zumindest in der Beta noch an allen Ecken und Enden, weil Gerätedateien nicht verfügbar sind, das procfs unvollständig ist und Syscalls ins Leere gehen. Die Terminal-Emulation kommt nicht mal mit Benutzerprogrammen für den Textmodus (mutt, top, nano, etc.) klar.
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.