.exe mit .exe aufrufen, stapeln sich die Prozesse?

  • Hallo werte Community,

    ich habe eine theoretische Frage, die ich beantwortet haben möchte, bevor ich diese Idee wirklich umsetze.

    Situation:
    Ich schreibe gerade an einen Script, welches mir einen PC für eine bestimmte Nutzung selbstständig einrichtet. Dazu gehören diverse Einstellungen in Windows, sowie die Installation von einigen Programmen. Im fertigen soll diese .xese Datei dann zusammen mit den dazugehörigen setups in einen Ordner gepackt auf einen Datenträger laden. Soweit so gut, ich komme Stück für Stück voran. Die einzelnen Schritte sind natürlich in jeweilige Funktionen gepackt wie z.B installAdobeReader(). Da einige der Programme bzw. Einstellungen einen Neustart fordern habe ich eine eigene reboot-Funktion geschrieben. Diese speichert mir je nach Funktion eine Flag in einer .txt Datei ab. Nach dem Reboot wird das Programm ebenfalls wieder gespeichert. Nun ist um innerhalb jeder Funktion um deren gesamten inhalt eine Bedingung gebaut, die den Stand der aktuellen Flag prüft und somit am richtigen Punkt erst weiterarbeitet. Das ist jetzt nur grob formuliert, es funktioniert jedenfalls.

    Idee:
    Nun bin ich zusammen mit einen Kollegen auf eine andere Lösung des Rebootsproblems gekommen. Wir halten diese theoretisch für besser, da man diese später mal mit weniger Fehlerquellen ändern kann und ein deutlich konsequenteres System ist.
    Das, was jetzt nur einzelne Funktionen sind in eigene Dateien packen. Und dann am Ende der Datei die nächste Aufrufen zum weiterarbeiten. Wenn man rebooten will kann man dann die nächste .exe Datei automatisch nach dem Neustart weiterlaufen lassen.

    AutoIt: func1
    ;Installtion Programm 1 ...
    Run(@ScriptDir&'\func2.exe')
    AutoIt: func2
    ;Installtion Programm 2 ...
    Run(@ScriptDir&'\func3.exe')

    Problem:
    Bevor ich mir nun die rießen Arbeit mache alles so zu zerstückeln, dass es läuft interessiert mich, wie es sich genau verhält, wenn ich mit einer .exe eine .exe aufrufe. Denn es werden (ich habe die genau Zahl gerade nicht im Kopf) lässig 30 Datein. Wenn ich auf das o.g. Beispiel bezogen mit func1 func 2 aufrufe und der aufruf das letzte im Script ist, wird dann func1 beendet, oder läuft diese im Hintergund mit. Dann hätte ich irgendwann 30 Prozesse am laufen und das möchte ich nicht.

    Ich weis, es ist viel Text um recht wenig Inhalt. Ich möchte nur meine Frage möglichst anschaulich formulieren.
    Dennoch hoffe ich auf eine Antwort, die mein Wissen erweitert.

    LG, Reiterfuchs ;)

    Einmal editiert, zuletzt von Reiterfuchs (10. Dezember 2015 um 15:41)

  • Naja. Die Idee ist ziemlich sinnlos. Mehrere Exe-Datei zu erstellen macht nur sinn, wenn man nebenläufigkeit erreichen will. Andernfalls kenne ich keine Sinnvolle anwendung. Das sorgt nur für unübersichtlichkeit, bzw. viele Dateien.
    Da halte ich es sogar für Sinnvoller, das gleiche Script mit Kommandozeilen Parametern aufzurufen und darin dann unterschiedliche Dinge zu machen.

    Zu deiner Frage:
    Run startet einen Prozess. Das aufrufende Programm läuft einfach weiter. Wenn dort nichts mehr steht wird es also beendet.
    Wenn es weiterlaufen soll muss man RunWait nutzen, oder eine Schleife bauen die ProzessExist nutzt, mit der Zurückgegebenen PID von Run.

    • Offizieller Beitrag

    Ich würde ebenfalls den ersten Weg gehen. Ein Programm, dass anhand von Infos entscheidet was getan werden muss.
    Es sei denn du willst wirklich parallel installieren. Übrigens 30 Prozesse zu starten ist ja kein Problem. Siehe Taskmanager, was auf deiner Kiste los ist :)

    Viele deiner Installationen kannst du ggf. auch durch portable Versionen ersetzen, diese musst du nur entpacken und konfigurieren. Spart ggf. ein paar Reboots.

    Dein Installer könnte sich zum Schluss sogar noch selbst löschen. (quasi aufräumen)

  • Der Acrobat Reader ist ein gutes Beispiel dessen was Xenoblogist mein. Acrobat muss man installieren, Sumatra lauft als EXE. Wenn mann also nur PDFs anzeigen will, dann gibt es eine einfachere Lösung -> Sumatra.

    Ich würde auch ein einzelnes Program bevorzugen. Daten ev in eine Ini auslagern. Ich habe noch nie versucht ein Scribt nach einem Reebot weiterlaufen zu lassen - wenn ich eine Möglichkeit suchen würde, würde ich den Stand der Dinge in eine ini oder in die reg. schreiben, und mein Programm dem Autostart hinzufügen, dann läuft es nach dem Reeboot.....


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich würde Reboots grundsätzlich solange rauszögern bis es wirklich notwendig wird. Normalerweise kann man problemlos zig Programme und Treiber nacheinander (teilweise sogar paralell, davon rate ich aber ab) installieren und erst ganz am Schluss einen finalen Reboot machen. Sollte ein hartnäckiges Programm dabei sein stellt man dieses ganz ans Ende der Installationsroutine.

    Ich würde ebenfalls darauf verzichten jeden Installationsschritt in eine separate EXE zu verpacken, alleine schon wegen des Verwaltungsaufwandes bei Scriptänderungen. Ich zweifle sogar an, dass es notwendig ist für jedes Programm eine extra Funktion zu schreiben. Die meisten Programme sind als msi Pakete mit "silent" Installer verfügbar. Andere Software hat seine eigenen "silent" Commandline Parameter und nur ganz wenige Setups lassen sich letztlich nur durch GUI Automatisierung installieren. Du brauchst also nur eine Funktion für die Mehrheit aller Setups die evtl. je nach Programm verschiedene Parameter an die Setup.msi/exe übergibt. Am besten packst du diese variablen Dinge sogar in eine editierbare Konfigdatei, dann kannst du unendlich viele Programme hinzufügen ohne auch nur eine Zeile Code in deinem Installationsscript ändern zu müssen. Spezialisierte Funktionen brauchst du dann nur noch für den kümmerlichen Rest.

    Ansonsten ist dein Ansatz doch gut. Schreib in irgendeine Konfigdatei an welcher Stelle dein Script durch einen Reboot unterbrochen werden musste und dann mach da weiter wo du aufgehört hast.

  • Kleines Beispiel:

    Spoiler anzeigen


    Und statt denn Run()-Aufrufen kannst du auch den Programmaufruf (mit Parameter) in den Registyautostart schreiben und das System mit Shutdown() neustarten. Dann wird nach dem Neustart in der nächsten Funktion weiter gemacht.

    LG
    Christoph :)

  • Ansonsten ist dein Ansatz doch gut. Schreib in irgendeine Konfigdatei an welcher Stelle dein Script durch einen Reboot unterbrochen werden musste und dann mach da weiter wo du aufgehört hast.

    Nein, sinnvoll ist, eine editierbare txt-Datei mit sämtlichen zu installierenden Programmen und deren Aufrufparametern zu erstellen.
    Die Kopie dieser Datei ist dann das Arbeitsmaterial. Jede abgearbeitete Zeile wird einfach aus der Arbeitsdatei gelöscht. Nach löschen der letzten Zeile wird auch die Arbeitsdatei gelöscht.
    Bei jedem Aufruf des Installationsprogramms wird nun die Arbeitsdatei abgearbeitet. Wenn ein Reboot notwendig ist, wird danach einfach mit der nächsten Installation aus der Arbeitsdatei fortgefahren.
    Existiert keine Arbeitsdatei mehr, ist die Komplettinstallation durchgelaufen.
    Die Textdatei garantiert höchstmögliche Flexibilität. Jeder DAU kann diese Datei mittels Doppelklick öffnen und auf Anweisung am Telefon "...in der 12ten Zeile, welche "PDFinstall" enthält, das /P durch /N ersetzen..."
    Haufenweise EXE-Dateien zu generieren, welche bei Änderungen eines simplen Programmparameters jedesmal neu kompiliert werden müssen ist jedenfalls ein debugtechnischer Supergau!

  • Erstmal danke für den vielen Input (habe mit weniger gerechnet). :thumbup:

    ch würde ebenfalls den ersten Weg gehen. Ein Programm, dass anhand von Infos entscheidet was getan werden muss.
    Es sei denn du willst wirklich parallel installieren. Übrigens 30 Prozesse zu starten ist ja kein Problem. Siehe Taskmanager, was auf deiner Kiste los ist

    Viele deiner Installationen kannst du ggf. auch durch portable Versionen ersetzen, diese musst du nur entpacken und konfigurieren. Spart ggf. ein paar Reboots.


    Nein, ich möchte nicht parallel installieren. Mir geht es auch nicht darum, dass der Rechner viele Prozesse nicht packen würde, sondern um eine saubere Arbeitsweise. Unnötige Prozesse offen zu halten ist einfach ein schlechtes Konzept. ;)

    Auf portable Versionen möchte ich nicht zurückgreifen. Der Adobe Reader war nur ein Beispiel, welches jeder kennen sollte. Ein Großteil der Programme sind nicht nur sehr groß, sondern haben auch keine portable Version. Nein, ich zähle jetzt keine Programme auf. :D

    Nein, sinnvoll ist, eine editierbare txt-Datei mit sämtlichen zu installierenden Programmen und deren Aufrufparametern zu erstellen.
    Die Kopie dieser Datei ist dann das Arbeitsmaterial. Jede abgearbeitete Zeile wird einfach aus der Arbeitsdatei gelöscht. Nach löschen der letzten Zeile wird auch die Arbeitsdatei gelöscht.
    Bei jedem Aufruf des Installationsprogramms wird nun die Arbeitsdatei abgearbeitet. Wenn ein Reboot notwendig ist, wird danach einfach mit der nächsten Installation aus der Arbeitsdatei fortgefahren


    Dieser Ansatz gefällt mir auf jeden Fall. Der große Vorteil zu meinem bisherigen Verfahren ist folgendes: Auf die Idee mit den Unterschielichen .exe Datein bin ja gekommen, weil ich nach einer Methode suche, dessen Konzept man auch nach einiger Zeit schnell nachvollziehen kann und die sich mit möglichst wenig Fehlerquellen ändern bzw. erweitern lässt. Bei meiner bisherigen Vorgehensweise zähle ich eine Variable mit und komme so nach Neustart an die richtige Stelle. Nachteil: Man benötigt dieses Gerüst und wenn man bei einer Änderung einen Zahlendreher hat findet man diesen nicht so einfach.

    Bei dieser Idee liegt alles zentral und eine strikte Durchnummerierung ist nicht notwendig. Wenn ich das so machen würde, dann würde ich die .txt Datei allerdings vom Programm evtl. selbst erstellen lassen. ;)

  • Das kannst du auch einfach so machen:

    AutoIt
    if NOT FileExist("InstallFile.txt") then
    	FileInstall("InstallationsDatei.txt","InstallFile.txt")
    endif

    Dort wird geguckt, ob die Datei existiert. Wenn nicht, wird die Datei erstellt. Beim Compilieren wird die zuerst angegebene Datei genommen und in der Exe gespeichert. Wenn die Exe ausgeführt wird und die Zeile aufgerufen wird, wird die Datei praktisch dahin entpackt.
    Für ne kleine Konfigurationsdatei geht sowas :).