.bat Aufruf mittels angeschlossenen Taster soll nur genau 1x erfolgen
Hey,
ich hab da mal ne kurze Frage.
Habe einen ext. Taster an einem PC angeschlossen. Sobald dieser getastet ist wird eine Batch Datei aufgerufen. Soweit so gut klappt das auch alles.
Die Batch Datei sollte aber nur genau einmal aufgerufen werden. Tastet der Taster nun kommt es vor das die Batch 2-5 mal etc. ( je nachdem wie lange getastet wird ) aufgerufen wird.
Ich habe jetzt versucht das in der Batch selbst so zu lösen:
@echo OFF
@rem Unterdrückung mehrerer Aufrufe
IF EXIST c:\Tischtaster\1.txt ( GOTO EXIT) else ( GOTO LOS )
:LOS
ECHO TASTER 1 AKTIV! >> c:\Tischtaster\1.txt
Eigentlicher Inhalt der Batch...
@rem Kurze Pause zum Verhindern mehrfacher Aufrufe
C:\WAIT.EXE\WAIT.EXE -t 6000
:EXIT
DEL c:\Tischtaster\1.txt
EXIT
Das hat schon eine deutliche Verbesserung hervorgerufen jedoch wird jezt immer noch mind. 2 manchmal 3 x die Batch aufgerufen, zu oft
Kennt ihr noch einen anderen, bessern, / schnelleren Trick?
Hab schon überlegt den Prozess abschiessen zu lassen aber das geht ja auch nicht ...
Vielen Dank für einen Tipp !
MFG Beatzler
ich hab da mal ne kurze Frage.
Habe einen ext. Taster an einem PC angeschlossen. Sobald dieser getastet ist wird eine Batch Datei aufgerufen. Soweit so gut klappt das auch alles.
Die Batch Datei sollte aber nur genau einmal aufgerufen werden. Tastet der Taster nun kommt es vor das die Batch 2-5 mal etc. ( je nachdem wie lange getastet wird ) aufgerufen wird.
Ich habe jetzt versucht das in der Batch selbst so zu lösen:
@echo OFF
@rem Unterdrückung mehrerer Aufrufe
IF EXIST c:\Tischtaster\1.txt ( GOTO EXIT) else ( GOTO LOS )
:LOS
ECHO TASTER 1 AKTIV! >> c:\Tischtaster\1.txt
Eigentlicher Inhalt der Batch...
@rem Kurze Pause zum Verhindern mehrfacher Aufrufe
C:\WAIT.EXE\WAIT.EXE -t 6000
:EXIT
DEL c:\Tischtaster\1.txt
EXIT
Das hat schon eine deutliche Verbesserung hervorgerufen jedoch wird jezt immer noch mind. 2 manchmal 3 x die Batch aufgerufen, zu oft
Kennt ihr noch einen anderen, bessern, / schnelleren Trick?
Hab schon überlegt den Prozess abschiessen zu lassen aber das geht ja auch nicht ...
Vielen Dank für einen Tipp !
MFG Beatzler
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 179310
Url: https://administrator.de/contentid/179310
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
10 Kommentare
Neuester Kommentar
Der Taster prellt (mit großer Wahrscheinlichkeit).
HAUPTFRAGE: Was ist "hardwaremässig" zwischen dem Taster und der aufgerufenen Batch-Datei?
Sinnvollerweise sollte entweder der Taster entprellt werden, z.B. mit einem RS-Flip-Flop.
Oder Du löst das über Software, dass z.B. der erste Tastendruck einen Interrupt auslöst und dann weitere "Nachpreller" ignoriert werden. Batch-Prog. dürfte aber dafür zu langsam sein ...
MfG, FM_81
HAUPTFRAGE: Was ist "hardwaremässig" zwischen dem Taster und der aufgerufenen Batch-Datei?
Sinnvollerweise sollte entweder der Taster entprellt werden, z.B. mit einem RS-Flip-Flop.
Oder Du löst das über Software, dass z.B. der erste Tastendruck einen Interrupt auslöst und dann weitere "Nachpreller" ignoriert werden. Batch-Prog. dürfte aber dafür zu langsam sein ...
MfG, FM_81
Hallo Beatzler,
ich würde wie -FM-81- auch die Ursache in der Hardwareverbindung vor dem Batch sehen. Da ich mich da Hardwaretechnisch gar nich auskenne, kann ich Dir dort auch nicht helfen. Allerdings hätte ich eine Idee, was im Batch etvtl. funktionieren könnte. Versuch doch am Anfang des Batches mal ein Warten mit zufälliger Verzögerung vor der Prüfung, ob der Taster schon gedückt wurde:
Gruß icsAT
ich würde wie -FM-81- auch die Ursache in der Hardwareverbindung vor dem Batch sehen. Da ich mich da Hardwaretechnisch gar nich auskenne, kann ich Dir dort auch nicht helfen. Allerdings hätte ich eine Idee, was im Batch etvtl. funktionieren könnte. Versuch doch am Anfang des Batches mal ein Warten mit zufälliger Verzögerung vor der Prüfung, ob der Taster schon gedückt wurde:
C:\WAIT.EXE\WAIT.EXE -t %random% %%100
Gruß icsAT
Zitat von @Beatzler:
Es werden dann auch
wieder mind. 2 Batches komischerweise mit genau der gleichen Wartezeit ( kann ich im CMD Fenster ja sehen welche random Zeit er
für diesen Aufruf genommen hat ) gestartet und enden somit ja auch wieder gleichzeitig ..
Weil der Taster eben in dem Falle zwei Signale kurz hintereinander gesendet hat. Und per Batch darauf zu reagieren ist eben einfach zu langsam; wenn das Ding per USB angeschlossen ist, muss das Schaltsignal ja quasi noch "durch die Verarbeitungsschichten des Betriebssystemes". Hast Du dort die Möglichkeit, Einfluss zu nehmen? (Weil das Ding evtl. eine Tastatur simuliert.)Es werden dann auch
wieder mind. 2 Batches komischerweise mit genau der gleichen Wartezeit ( kann ich im CMD Fenster ja sehen welche random Zeit er
für diesen Aufruf genommen hat ) gestartet und enden somit ja auch wieder gleichzeitig ..
Eine Idee hätte ich vllt. noch: zu Beginn der Batch kurz warten (Random um ca. 100ms?), dann irgendwie schauen, ob weitere Instanzen der selben Batch laufen, die restlichen alle killen, dann erst weiter machen.
Wenn nicht bleibt m.E. nur der schon genannte Hardwareansatz?
MfG, FM_81
moin,
wenn ein Handle geöffnet ist kann ein anderes dieses nicht benutzen.
oder wer zuerst kommt malt zuerst
mit der Umleitung >> braucht ein Nachzögling sogar noch länger
Gruß Phil
wenn ein Handle geöffnet ist kann ein anderes dieses nicht benutzen.
oder wer zuerst kommt malt zuerst
mit der Umleitung >> braucht ein Nachzögling sogar noch länger
@echo off & setlocal
set /p raus=<testdatei 2>nul
if defined raus goto :eof
(for /l %%i in (1,1,100000) do @echo %%i )>testdatei || goto :eof
:: weiter gehts
:: und noch weiter
:: Abschluss
:Loeschversuch
del testdatei 2>nul ||goto :Loeschversuch
Gruß Phil
moin Beatzler,
Es wird jede Zeile eine Ziffer bis N in die Datei eingetragen.
Solange wird jeder weitere Batch (eigentlich schon in Zeile 3 rauzsgeworfen) bis der erste Batch die Datei wieder gelöscht hat.
Zeile 4 ist nur zur Sicherheit, falls der zweite Batch zu schnell (nur ein Zeile) hinterherhinkt, dann schlägt das öffnen der Datei zum reinschreiben Fehl (der erste Batch schreib ja schon hinein) und bei Fehler wird das Goto :eof ausgeführt.
Goto :löschversuch ist eigentlich nutzlos, da die Zeile 3 für Folgende schon lange gegriffen hat.
Gruß Phil
Warum (1,1,100000) =?
Es kann auch schon 10000 ausreichend sein. Wichtig ist nur eine Genügend große Zeitspanne die Testdatei mit einem Handle (Lesgeschützt) zu öffnen.Es wird jede Zeile eine Ziffer bis N in die Datei eingetragen.
Solange wird jeder weitere Batch (eigentlich schon in Zeile 3 rauzsgeworfen) bis der erste Batch die Datei wieder gelöscht hat.
Zeile 4 ist nur zur Sicherheit, falls der zweite Batch zu schnell (nur ein Zeile) hinterherhinkt, dann schlägt das öffnen der Datei zum reinschreiben Fehl (der erste Batch schreib ja schon hinein) und bei Fehler wird das Goto :eof ausgeführt.
Goto :löschversuch ist eigentlich nutzlos, da die Zeile 3 für Folgende schon lange gegriffen hat.
Gruß Phil
Falls der Batch sowieso länger benötigt würde der Aufruf der Batch so genügen. Laut Beitrag Titel gefragt.
Da Handle 4 benutzt wird, können trotzdem die Anderen und Fehlermeldungen gelesen oder geloggt werden.
Eine weitere Ausführung schlägt fehl während der erste Batch noch läuft.
Für Abbruch im Batch sind weitere möglichkeiten:
1. den Batch zuerst und danach eine Zeit sperren
2. zuerst eine Zeitspanne abwarten dann den Batch starten
Analog dazu bei 1. Batch: die Zeilen 5 und 6 tauschen:
Und immer daran denken! Geht der eigentliche NutzBatch in die Binsen
einsetzen. Und in einem CMD Fenster ausführen.
Gruß Phil
Da Handle 4 benutzt wird, können trotzdem die Anderen und Fehlermeldungen gelesen oder geloggt werden.
MyBatch.cmd 4>"%temp%\OneBatchOnce"
Für Abbruch im Batch sind weitere möglichkeiten:
1. den Batch zuerst und danach eine Zeit sperren
@echo off & setlocal
:: ein weiterer Batch führt zum Abbruch wärend der 1. Batch in der Klammer ist (OriginalBatch läuft zuerst durch und danch 10 sec Ping)
(
call :OriginalBatch
echo in Zehn sekunden darf der naechste Batch erst.
ping localhost -n 10 >nul
) 4>"%temp%\BatchTimer10secMin" || goto :eof
echo ab hier kann ein weiterer Batch von vorn los rennen!
goto :eof
:OriginalBatch
Echo Meine Batch Beginnt SOFORT mit der Ausfuerung.
echo Batch ist fertig
2. zuerst eine Zeitspanne abwarten dann den Batch starten
@echo off & setlocal
:: Variante 1
:: Für den Abbruch bis zum löschen der TestDatei ( !! TestDatei muss nachher mindestens erstellt werden, 1. Batch läuft nachher Weiter)
if exist "%temp%\Testdatei" goto :eof
:: Variante 2
:: Für den Abbruch bis die Schleife Fertig ist (1. Batch läuft nachher weiter)
(for /l %%i in (1,1,100000) do @echo %%i) >"%temp%\Testdatei" 2>nul || goto :eof
echo ab hier kann ohne Variante 1 ein weiterer Batch von vorn los rennen!
:: Variante 3
:: Alternative als Timer (ping) (Batch läuft nachher weiter)
(echo xxx &ping localhost -n 10 >nul) >"%temp%\Testdatei" 2>nul || goto :eof
echo ab hier kann ohne Variante 1 ein weiterer Batch von vorn los rennen!
:: Mein Batch
Echo Meine Batch beginnt erst SPAETER mit der Ausfuerung
:Loeschversuch
if exist "%temp%\Testdatei" del "%temp%\Testdatei" 2>nul ||goto :Loeschversuch & :: ohne Variante 1
echo Batch ist Fertig
goto :eof
Und immer daran denken! Geht der eigentliche NutzBatch in die Binsen
Echo ON
Gruß Phil