Exec 10 Geschrieben 13. Januar 2011 Melden Teilen Geschrieben 13. Januar 2011 Hallo liebe Scriptler, erstmal den Sinn und Zweck des Scrips: Wir haben einen Beamer zwecks Werbung hinter eine Glasscheibe gestellt und an einem PC angeschlossen, auf dem können jetzt verschiedene Videos gestartet werden die auch bis spät Abends (also wenn ich nichtmehr an der Arbeit bin) laufen sollen. Der Beamer ist mit dem PC via Com-Anschluss verbunden und auch ansprechbar, ich wiederum greife auf den Beamer-PC via VNC-Viewer zu. Nun zu dem Problem, der PC fährt hoch, startet das Script, das Script stellt via HyperTerminal die Verbindung zu Beamer her und dann soll der Beamer mit dem Befehl "pwr on" gestartet werden. An dieser Stelle hakt es, der Command wird nicht übernommen, wenn ich dagegen das Script starte und mir anschaue was er macht bekomme ich eine positive Bestätigung und alles läuft wie geplant. Der Command ist also prinzipiell schonmal richtig, ich habe schon vieles ausprobiert und auch Pausen wie ein bekloppter eingebaut nur für den Fall das es dem PC zu schnell geht. Hier das mini-script.. set WshShell = CreateObject("WScript.Shell") wscript.sleep 20000 'Schließt ein Popup das durch die Onboard-GraKa am Anfang erscheint wshshell.Sendkeys "{ENTER}" 'Fuehrt die HyperTerminal-Datei aus WshShell.run "C:\Beamer.ht" 'Wartet 10 Sekunden bis das Terminal geladen wurde Wscript.sleep 10000 'Sendet den Befehl zum Anschalten des Beamers WshShell.SendKeys "pwr on" wscript.sleep 2000 'Bestaetigt den gesendeten Befehl wshShell.Sendkeys "{ENTER}" wscript.sleep 10000 'schliesst das HyperTerminal wshShell.sendkeys "%{F4}" wscript.sleep 2000 'bestaetigt die Abfrage fuers schliessen wshShell.SendKeys "{ENTER}" wscript.sleep 3000 'startet das Werbe-Video im VLC wshShell.run """Pfad""" 'wscript.sleep 5000 'startet die Grossansicht des Videos 'wshShell.Sendkeys "f" 'wscript.sleep 3000 'bringt das Video auf Fullscreen '"^H" Da das Script an sich schon oft normal funktioniert hat frage ich mich woran es sonst noch liegen könnte. Vielleicht hat jemand von euch das gleich schonmal probiert und kann mir da weiterhelfen (?) Vielen Dank im Voraus und lg Zitieren Link zu diesem Kommentar
Robi-Wan 10 Geschrieben 13. Januar 2011 Melden Teilen Geschrieben 13. Januar 2011 Hallo, ich habe das richtig verstanden, dass das Script als Task startet, korrekt? Dann überprüfe doch mal die Berechtigungen des ausführenden Accounts. Grüße, Robert Zitieren Link zu diesem Kommentar
Exec 10 Geschrieben 13. Januar 2011 Autor Melden Teilen Geschrieben 13. Januar 2011 Jein, ich habe es früher als task starten lassen aber um die Fehlerquellen zu senken habe ich die vbs Datei nun einfach in den Autostart gesteckt und es startet mit sleep 10 sec nach dem Booten. Als es noch als task startete habe ich die Berechtigungen schon überprüft, ich verwende einen User mit Adminrechten zum starten, ein 2ter task zum Herunterfahren läuft mit den gleichen Berechtigungen und funktioniert problemlos. lg, Exec Zitieren Link zu diesem Kommentar
Sigma 10 Geschrieben 14. Januar 2011 Melden Teilen Geschrieben 14. Januar 2011 (bearbeitet) Hallo, bei SendKeys kann man sich leider nie sicher sein, in welchen Kontext die Tasten geschickt werden. Such Dir am besten ein anderes (scriptfähiges) Programm für die COM-Kommunikation. Oder schreib Dir eins. Die Windows-API dazu ist recht simpel. In C++ oder VB gibt es einige Codebeispiele im Netz. Grüße, Sigma Ein einfaches Beispiel in C++ mit fest codierten Parametern: #include <windows.h> #include <iostream> int main(int argc, char* argv[]) { DWORD bytes_read = 0; // Number of bytes read from port DWORD bytes_written = 0; // Number of bytes written to the port HANDLE comport = NULL; // Handle COM port int bStatus; DCB comSettings; // Contains various port settings COMMTIMEOUTS CommTimeouts; //place code for processing command line arguments here char message[]="pwr on"; char OUTBUFFER[sizeof(message)]; wchar_t portNumber[]=L"COM5"; //message to transmit strcpy_s(&OUTBUFFER[0], sizeof(message),message); //COM port to open wchar_t *file=new wchar_t; wcscpy_s(file,sizeof(L"\\\\.\\"),L"\\\\.\\"); wcscat_s(file,sizeof(portNumber),portNumber); // Open COM port if ((comport = CreateFile(file, // COM port to open GENERIC_READ | GENERIC_WRITE, // for reading and writing 0, // exclusive access NULL, // no security attributes OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { std::wcout << L"\nsome error opening comport\n"; return 1; // error processing code goes here } // Set timeouts in milliseconds CommTimeouts.ReadIntervalTimeout = 0; CommTimeouts.ReadTotalTimeoutMultiplier = 0; CommTimeouts.ReadTotalTimeoutConstant = 100; CommTimeouts.WriteTotalTimeoutMultiplier = 0; CommTimeouts.WriteTotalTimeoutConstant = 100; bStatus = SetCommTimeouts(comport,&CommTimeouts); if (bStatus != 0) { std::wcout << L"\nsome error configuring comport timeouts\n"; return 1; // error processing code goes here } // Set Port parameters. // Make a call to GetCommState() first in order to fill // the comSettings structure with all the necessary values. // Then change the ones you want and call SetCommState(). GetCommState(comport, &comSettings); comSettings.BaudRate = 115200; comSettings.StopBits = ONESTOPBIT; comSettings.ByteSize = 8; comSettings.Parity = NOPARITY; comSettings.fParity = FALSE; bStatus = SetCommState(comport, &comSettings); if (bStatus == 0) { std::wcout << L"\nsome error configuring communication settings\n"; return 1; // error processing code goes here } //send data bStatus = WriteFile(comport, // Handle &OUTBUFFER, // Outgoing data 48, // Number of bytes to write &bytes_written, // Number of bytes written NULL); if (bStatus != 0) { std::wcout << L"\nsome error transmitting data\n"; return 1; // error processing code here } CloseHandle(comport); return 0; } bearbeitet 14. Januar 2011 von Sigma Grammatik verbessert & Fehler im Code entfernt Zitieren Link zu diesem Kommentar
Exec 10 Geschrieben 14. Januar 2011 Autor Melden Teilen Geschrieben 14. Januar 2011 Hallo Sigma, danke für den Tipp, das Bsp sieht für mich, wie zu erwarten war, sehr kompliziert aus aber probieren geht über studieren. Du hast nicht zufällig schon eine Idee womit ich beginnen könnte, ist ein recht offenes Feld ;) Danke und lg Zitieren Link zu diesem Kommentar
Sigma 10 Geschrieben 14. Januar 2011 Melden Teilen Geschrieben 14. Januar 2011 Hallo, das obige Beispiel ist ursprünglich von hier. Die Version in meinem Beitrag sollte sich schon kompilieren lassen, z. B. mit Visual C++ und dem Windows SDK oder mit MinGW & gcc. Wenn Du keine Fehlerbehandlung oder eine Steuerung über Parameter brauchst, kannst Du das Beispiel leicht an Dein Szenario anpassen. Zwischen die Anführungszeichen kommt die Nachricht, die an den Beamer gehen soll. char message[]="pwr on"; In der Zeile passt Du die Nummer des COM-Ports an, also anstelle COM5 den bei Dir verwendeten. wchar_t portNumber[]=L"COM5"; In den Zeilen nach // Set timeouts in milliseconds und nach // Set Port parameters. trägst Du die Verbindungsparameter (BaudRate, Parity-Bit) ein. Danach noch kompilieren lassen und hoffen, das es fehlerlos geht. Grüße, Sigma Zitieren Link zu diesem Kommentar
Exec 10 Geschrieben 17. Januar 2011 Autor Melden Teilen Geschrieben 17. Januar 2011 Hi, Das hört sich garnicht so schwer an, ma schauen ob ich das auf die Reiche kriege. Ich werde das Ergebnis hier posten wenn es soweit ist. Vielen Dank schonmal für die Mühe :) lg, Exec Zitieren Link zu diesem Kommentar
Exec 10 Geschrieben 21. Januar 2011 Autor Melden Teilen Geschrieben 21. Januar 2011 Hallo, Statusupdate: Bin dabei das Script zu basteln, habe mich aber an einigen Problemen festgebissen, da ich seit 5 Jahren nichtmehr C++ angewendet habe auch keine Überraschung. Soweit ich das erkennen kann ist der von dir gepostete Code in Visual C++ erstellt worden und ich benutze dummerweise Bloodshed, ich werde also erstmal einige Funktionen anpassen müssen und melde mich dann wieder. lg, Exec Zitieren Link zu diesem Kommentar
Exec 10 Geschrieben 31. Januar 2011 Autor Melden Teilen Geschrieben 31. Januar 2011 Da bin ich wieder, ich habe nun ziemlich lange versucht mit C++ das Prog zum Laufen zu bringen ohne Erfolg, habe daraufhin meinem altem VB Script noch eine Chance gegeben. Es läuft nun damit, ich denke um das mit C++ zu realisieren hätte ich dann doch etwas tiefer wühlen müssen. Nicht sehr sportlich das Problem damit einfach zu umgehen aber es funktioniert ;) Nur für den Fall das jemand den Thread mal finden sollte und meine Lösung sehen möchte, ich habe in dem VB Script einfach die commands für Sendkey 3 mal wiederholt mit Pausen dazwischen. Das Problem war anscheinend das bei der ersten Eingabe es nicht so ankam wie es sollte. Ist zwar total stupide einfach mehrmals die commands reinzuhauen aber solange es klappt... Danke trotzdem für die Hilfe, zumindest weiß ich jetzt das ich in C++ doch mal mehr reinschauen sollte. lg, Exec Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.