(18.10.2024 19:32 )GerdW schrieb: Hallo Minako,
Zitat:Zum Glück hatte ich letzte Woche einen Python Einsteigerkurs und weiß zumindest was die Shell ist.
Ich habe jedoch null Ahnung wie man mit dieser Arbeitet...
Das mit der Shell war nur ein Beispiel, um zu zeigen, wie man eine EXE mit Parametern aufrufen könnte…
(Grumpy old man: Diese Jugend von heute, weiß nicht mal was eine Shell ist… )
Oder auch nur warum man an der autoexec.bat oder der config.sys Änderungen vornehmen sollte wenn man bestimmte Spiele startet. Grundwissen Computer halt :-P
Zitat:Zitat:Gibt es irgendwo Info welche Befehle ich der Shell übergeben muss, damit sie die .exe öffnet?
Du musst nicht mit der Shell arbeiten.
Du musst nur beim AppBuilder angeben, dass deine EXE später "command line arguments" entgegen nehmen soll. (Einstellung in den Build-Settings.)
Und in deiner EXE diese Argumente abfragen (PropertyNode/Methode der App) und auswerten. (Dazu müsste es auch ein Beispiel geben…)
Die vereinfachte Erklärung ist:
Das erste was du in die Shell eingibst (der erste vollständige String) wird als "0." Argument interpretiert und ist dein eigentlicher Befehl um das Program auszuführen. Alles was danach kommt wird als einzelne Argumente an deine Exe "übergeben" - die dann damit machen kann was sie will. Der PC lässt die Exe also wissen, dass der Nutzer mehr im Sinn hatte als sie einfach nur auszuführen. Das kann dann zum Beispiel als Shell Commando so aussehen:
(weis nicht ob der in der Reihenfolge noch richtig ist):
"shutdown" ist die Neustart / Runterfahrroutine von Windows. Führst du die ohne Kommandozeilenparameter aus, wirft die dir ne Info zurück welche sie gerne hätte um zu wissen was sie tun soll. In dem Fall dann als ersten (Leerzeichengetrennten) Parameter "-r" (für Reboot) und als zweiten "NOW" (für den Ausführungszeitpunkt).
Für dich könnte so eine Syntax also Beispielhaft so aussehen:
"C:\MeinOrdner\SubVI.exe 3600 COM15"
Das würde dann versuchen die SubVI.exe auszuführen, die als erstes Argument (glaube ich) die "3600" übergeben kriegt und als zweites "COM15" (weis grade nicht ob das eigentliche Kommando mit übergeben wird, ausprobieren, off by one error Gefahr). Die Argumente gehen als Strings rein, die 3600 musst du also noch in eine Zahl umwandeln um das (zum Beispiel) 3600s laufen zu lassen (prinzipiell kannst du sogar die Einheit mit übergeben, wenn du sehr variabel bei den Messzeiten sein willst). "COM15" würdest du dann als den Port übergeben über den du auf das Messequipment zugreifst.
Achtung dabei immer: Selbst wenn du sagst, es wird auf unterschiedliche Messgeräte zugegriffen, muss man immer annehmen, dass der Nutzer dumm ist und versehentlich versucht auf eine bereits in Benutzung befindliche Resource zuzugreifen. Es macht daher Sinn solche Fälle zumindest in der Fehlerbehandlung im SubVI zu bedenken (Crash beim starten abfangen; schlimmstenfalls frisst das sich sogar einfach hart fest, da es auf verfügbar werden der Resource wartet (was vielleicht weitere 99 Tage dauert). Ohne Feedback weis der Nutzer dann nicht was los ist.
Handhaben kannst du sowas entweder im Main VI (wo du Rückinfo einholst ob Resourcen noch belegt sind; über Commandozeile glaube schwierig, da müsstest du die Kommunikation mit den SubVIs wahrscheinlich über TCP/IP und den Localhost laufen lassen (aufpassen bei den Ports!); oder über ein File in das du die geblockten Resourcen einträgst (wichtig ist dann, dass die SubVIs die auch wieder selbst freigeben)). Der Vorteil bei getrennten Exen liegt allerdings immerhin darin, dass du die Tasks auch für Windows voneinander getrennt hast. Daher: Wenn du mal einen Messtask per Taskmanager abschießen musst, kollabieren nicht gleich alle anderen mit.
P.S: Mittlerweile kann die Shell (deutsch: Kommandozeile) glaube auch mit Leerzeichen im Dateinahmen / Ordnernamen umgehen. Da musst du dann aufpassen, dass du das Kommando mit "" einrahmst um anzuzeigen wo das Kommando anfängt und endet. Das wird auf modernen Systemen immer wichtiger, da häufiger auch mal Leerzeichen in den Ordnernamen vorkommen und es sehr unglücklich ist wenn dadurch dein Kommando mittendrin unterbrochen und unsinnig verarbeitet wird. Aus:
Code:
C:\Mein Ordner\SubVI.exe 3600 COM15
würde dabei der Befehl:
"C:\Mein" - der auf Kommandozeilenebene bereits zu einem Fehler führen dürfte.
"Ordner\SubVI.exe" wäre dann das erste Argument, danach "3600" und "COM15".
Korrekt müsste es sein:
Code:
"C:\Mein Ordner\SubVI.exe" 3600 COM15
damit die Kommandozeile weis, dass der Teil nach dem Leerzeichen (und das Leerzeichen selbst) immer noch zum Befehl gehören und nicht bereits Argumente sind die ans Programm übergeben werden sollen.
Hoffe das hilft ein bisschen als Abriss dazu.
P.P.S: Achja TCP/IP und Ports: Das Problem wenn du mit dem Localhost redest ist, dass der Rechner mit sich selbst redet und das dadurch (wenn ich es nicht Falsch in Erinnerung habe) verschiedene Ports für die Kommunikation gebraucht werden um Sender und Empfänger richtig zuzuordnen. Versuchst du mit verschiedenen SubVIs über den gleichen Port zu reden, ist auch hier wieder der Port bereits geblockt. In der Variante mit Kommandozeile ist allerdings glaube ich auch der "Networkstream", "globale Variablen", "FGV" oder ähnliches was man zum Austausch nutzen könnte verfügbar.
Gruß Kiesch