Hallo, wie ist es möglich, mit einer EAGLE-ULP eine Windows Programm zu starten? Dass es möglich ist, weiß ich, z.B. wird per ULP LTSpice gestartet. Aber leider verstehe ich die ULP nicht richtig, da sie sehr komplex aufgebaut ist (automatisch Verzeichnisse durchsuchen, etc.). Mir ist das Programm und der Pfad bekannt. Die EAGLE-Hilfe und Onkel Gugel konnten mir nicht helfen.
Die ULP-Funktion heißt system(). Meine EAGLE-Hilfe (7.7) hat eine recht ausführliche Beschreibung unter
1 | User Language -> Builtins -> Builtin Functions -> Miscellaneous Functions -> system() |
Suchmaschinen liefern mit "man system" die Beschreibung der Unix-Funktion. Die Unterschiede zu Windows sind minimal und werden in der EAGLE-Hilfe erklärt.
Ich habe ein wenig herumprobiert und diverse Internetforen- und hinweise besucht. Ich habe einen Teilerfolg :( Ich kann mit der ULP alle Programme öffnen, die auf Laufwerk C liegen (Ausprobiert z.B. Notepad). Aber kein Programm, das auf einem anderen Laufwerk liegt. Ich habe die EAGLE-Dateien (Projekte, Librariues, ULPs, usw.) auf einem separaten Laufwerk - bei mir P:/ - und das Programm, dass ich starten möchte liegt ebenfalls auf Laufwerk P. Wenn ich folgendes Programm ausführe: kommt eine Fehlermeldung:
1 | string sCmd; |
2 | string sDatei = "P:\\Unterordner1\\EAGLE\\scr\\update_eagle_lbr.cmd"; |
3 | sprintf(sCmd, "cmd.exe /c \"%s\"", sDatei); |
4 | system(sCmd); |
Die Fehlermeldung lautet (im DOS-Fenster):
1 | Der Befehl "P:\" ist entweder falsch geschrieben oder |
2 | konnte nicht gefunden werden.
|
Ist das programm auf Laufwerk C, wird es ausgeführt. Wenn ich im offenen DOS-Fenster auf Laufwerk P wechsele, wird dieses ebenfalls angezeigt. Ich bin ratlos. Hinweis: Die Doppel-Backslash sind nötig, weil diese Angabe im String ein Sonderzeichen ist. Der Pfad wird richtig übergeben (Kontrolle des Pfads in einem Text-Dialogfeld war erfolgreich) Ich habe auch schon probiert "start" einzufügen:
1 | sprintf(sCmd, "cmd.exe /c start \"%s\"", sDatei); |
Dann passiert ebenfalls nichts. Das Fenster geht im Hintergrund auf und zu, aber das Programm wird nicht ausgeführt.
und wenn Du Dir eine passende Batch Datei auf C:\ legst und diese startest?
Das würde gehen, aber auf diese Datei müssen mehrere Personen im Netzwerk Zugriff haben, daher ist auch alles auf dem Netzlaufwerk abgelegt und zu finden.
Balthasar schrieb: > Das würde gehen, aber auf diese Datei müssen mehrere Personen im > Netzwerk Zugriff haben, daher ist auch alles auf dem Netzlaufwerk > abgelegt und zu finden. Mein Vorschlag (quick and dirty), einen Batch indirekt über einen Batch aufrufen. Macht die Übergabe vielleicht etwas einfacher.
1 | #usage "syscall test via internal generated cmd file"
|
2 | "usage: simply RUN the ulp"
|
3 | |
4 | string sPath = "Z:\\Temp-proj\\EagleSysCalls\\"; |
5 | string sUlpBatchName = "UlpBatch.cmd"; |
6 | string sUlpFullPath, sCmdLine; |
7 | |
8 | string sExternalBatch = "Batch2call.cmd"; //batch must exist, put external commands in there |
9 | |
10 | |
11 | // Generate own batch with command line inside
|
12 | sprintf( sUlpFullPath, "%s%s", sPath, sUlpBatchName ); |
13 | sprintf( sCmdLine, "cmd.exe /c \"%s%s\"", sPath, sExternalBatch); |
14 | |
15 | output( sUlpFullPath, "w") |
16 | printf(sCmdLine); |
17 | |
18 | |
19 | // Run own batch
|
20 | system(sUlpFullPath); |
@Balesi Soll bzw. wird dein ULP aus dem Script- oder Boardeditor gestartet?
Eagle_Layouter schrieb: > @Balesi > Soll bzw. wird dein ULP aus dem Script- oder Boardeditor gestartet? Hab ich aus einem Schaltplan getestet, sollte aber egal sein. Wenn du den Kontext brauchst machst du das mit
1 | if (board) { // oder (library) | (schematic) |
2 | |
3 | |
4 | |
5 | }
|
P: ist ein Netzlaufwerlsbuchstabe. Setz mal statt dem gemappten Laufwerksbuchstaben den UNC-Pfad ein. Bin ich ja mal gespannt... aus "P:" wird dann "\\servername\wichtige_ordner\" usw (wie man jetzt doppelbackslashes da ordentlich als Zeichen einfügt, weis sich nicht, sollte aber jetzt das kleinere Problem sein.)
@Balesi habe wie du auch mal etwas 'rumgespielt'. ;) mein lösungansatz sieht wie folgt aus. A) Scriptdatei für ein Symbol in der Menüleiste (hier im Board-Editor), welches das ULP aufruft. Vereinfacht die Sache etwas. Das ständige Schreiben in der Kommandozeile ist ja auch nicht der Bringer.
1 | BRD: |
2 | MENU '[D:\!BACKUP\EAGLE_WINDOWS\PNG\tmp.png] Open application : RUN D:\!BACKUP\EAGLE_WINDOWS\ULP\tmp.ulp;' |
B) das ULP selbst
1 | #require 5.1001 |
2 | |
3 | // CONFIG |
4 | string programPath_WIN = "C:/Windows/Notepad.exe"; |
5 | string OS_SYSTEM = strlwr(" " + OS_SIGNATURE); |
6 | string FileExists[]; |
7 | |
8 | if (strrstr(OS_SYSTEM, "window") > 0) |
9 | { |
10 | if (fileglob(FileExists, programPath_WIN) > 0) |
11 | system("cmd.exe /c START \"\" \"" + programPath_WIN); |
12 | else |
13 | dlgMessageBox("File path issue, incorrect path: " + programPath_WIN); |
14 | } |
Eventuell funzt es ja bei dir auch oder dient als Idee.
Äxl (geloescht) schrieb: > Setz mal statt dem gemappten > Laufwerksbuchstaben den UNC-Pfad ein. While most command line utilities do fully support UNC paths, they cannot be set as the current directory. Launching a batch file from a UNC path will implicitly run CMD.exe with that UNC path, this will often return the error: path is an invalid current directory path. UNC paths are not supported. Defaulting to Windows directory. https://ss64.com/nt/cmd.html Die Parameterübergabe ist unter windows leider etwas komplex. Hier mal nur der Teil für "quote" characters: >If /C or /K is specified, then the remainder of the command line is >interpreted as a command and the following logic is used to process quote >(") characters: > > 1. If all of the following conditions are met, then quote characters on >the command line are preserved: >- No /S switch (Strip quotes) > - Exactly two quote characters > - No special characters between the two quote characters, where special is one of: & < >( ) @ ^ | > - There are one or more whitespace characters between the the two quote >characters > - The string between the two quote characters is the name of an executable file. https://ss64.com/nt/syntax-cmd.html Dazu kommen noch die Restriktionen des ulp system() calls. Meiner einer ist der Meinung das es besser ist einen batch zu erzeugen und den zu starten. X4U schrieb: >> @Balesi >> Soll bzw. wird dein ULP aus dem Script- oder Boardeditor gestartet? > > Hab ich aus einem Schaltplan getestet, sollte aber egal sein. Sorry für mein fehlposting.
Hallo, Eagle_Layouter schrieb: > @Balesi > und hat es (etwas) genützt? Nein, hat es nicht! Ich habe viel probiert und auch weiter gegoogelt, aber leider mit nur einem bescheidenen Ergebnis. Ich habe eine ulp geschrieben, die eine cmd-Datei erzeugt. (Dank an X$U) Das klappt auch alles, aber die Ausführung der cmd-Datei klappt nicht und erzeugt immer die gleiche Fehlermeldung. Das kuriose an der Sache ist: Klicke ich auf die erzeugte Datei kommt die besagte Fehlermeldung. Kopiere ich den Inhalt der cmd-Datei (bzw. schneide den Inhalt komplett aus) und füge den Inhalt des Zwischenspeichers in eine leere oder in die selbe(!) Datei wieder ein, kann ich die Datei aufrufen und diese wird auch ausgeführt. Kurz: ich bin einen Schritt weiterr, aber mein Ziel erreiche ich nicht. :(
Ist da jetzt schon mehr an Funktionalität dazu gekommen oder geht es immer noch darum, nur ein (Windows-)Programm via ULP zu starten?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.