system() - mehrere Kommandos



  • Hallo

    Wie kann man mit der Funktion system(...) mehrere Kommandos auf einmal ausführen?

    Oder gibts eine andere Funktion?

    Mit freundlichen Grüssen
    Tch



  • system ist meist sicher nicht die beste Wahl - was willst du denn machen?



  • Ich muss ein anderes Programm starten. Dieses erwartet dass ich eine Umgebungsvariable setzte.
    Wenn ich aber folgendes schreibe:

    system("set SSDIR=Path"); // Umgebungsvariable
    system("ss.exe Dir");     // Programm starten
    

    ist im zweiten system()-Aufruf 'SSDIR' nicht mehr bekannt. Desshalb
    suchte ich eine Art wie man zwei Kommandos ins gleiche system() packen kann.

    Unterdessen hatte ich _putenv() gefunden, mit der eine Umgebungsvariable für den aktuellen Process gesetzt werden kann.

    flenders schrieb:

    system ist meist sicher nicht die beste Wahl - was willst du denn machen?

    Ich nehme system(), weil ich bestimmte DOS-Features brauche, wie z.B. das Umleiten von Streams: ss.exe Dir >datei.txt

    Was würdes du sonst empfehlen?

    Gruess
    Tch



  • hmm... zur not :

    ..
      F =fopen ("script.cmd", "w");
      printf (F, "SET ... \n ss.exe Dir");
      fclose(F);
    ..
    
      system ("scipt.cmd");
    ..
    

    oder

    system(" echo \" bla1 \n ss.exe Dir \" > script.cmd ");
      system("script.cmd");
    

    so würd ich das mal probieren..



  • Mit Pipes geht sowas glaub' auch 🙄



  • Setzt doch einfach die Variable per SetEnvironmentVariable. Der Child-Process erbt dann per default den Environment-Block des Parents.



  • Ist dafür nicht CreateProcess() zuständig? Imho kann ich dort auch gleich die Umgebungsvariablen mitgeben?

    MfG SideWinder



  • SideWinder schrieb:

    Imho kann ich dort auch gleich die Umgebungsvariablen mitgeben?

    Du kannst es aber auch lassen. Dann gehen die Umgebungsvariablen des Erzeugers automatisch an den neuen Process über. Warum willst Du Dir extra Arbeit machen?



  • -King- schrieb:

    SideWinder schrieb:

    Imho kann ich dort auch gleich die Umgebungsvariablen mitgeben?

    Du kannst es aber auch lassen. Dann gehen die Umgebungsvariablen des Erzeugers automatisch an den neuen Process über. Warum willst Du Dir extra Arbeit machen?

    Oh nicht genau genug gelesen: Dachte er will ein Programm über system starten das neue Umgebungsvariablen benötigt und nicht er will Umgebungsvariablen setzen indem er eine Batchdatei aufruft.

    MfG SideWinder



  • SideWinder schrieb:

    Oh nicht genau genug gelesen: Dachte er will ein Programm über system starten das neue Umgebungsvariablen benötigt und nicht er will Umgebungsvariablen setzen indem er eine Batchdatei aufruft.

    🙂

    Genau das will er, so habe ich das auch verstanden. Die Umgebungsvariable setzt er nun einfach bei sich selbst und ruft dann von mir aus auch CreateProcess auf. Dabei kann er aber den Environment-Block auf NULL setzen, er braucht nicht extra einen zu erzeugen und anzugeben. Es vererbt sich der eigene Block an den Child-Process.

    Aus der Hilfe zu CreateProcess:

    MSDN schrieb:

    lpEnvironment
    [in] Pointer to an environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.



  • Weiß ich - vor kurzem auch CreateProcess() in der MSDN durchgesehen für ein kleines Programm ;).

    Bloß wusste ich nicht, dass es besser ist zuerst bei sich die Umgebungsvariablen zu ändern und dann CreateProcess() mit 0 aufzurufen als sie gleich in CreateProcess() anzugeben?!

    Verstehe jetzt nicht ganz wo hier der Vorteil liegen soll 😕

    MfG SideWinder



  • SideWinder schrieb:

    Verstehe jetzt nicht ganz wo hier der Vorteil liegen soll 😕

    Von besser habe ich nichts gesagt. Es scheint mir nur einfacher zu sein. Ich löse das also in zwei Zeilen so:

    SetEnvironmentVariable(TEXT("DIESDAS"), szUserEingabe);
    CreateProcess(...);

    Wie sieht nun Deine Lösung aus? Bedenke, daß Du im Deinem Environment noch einige Variablen mehr als diese eine hast. Bedenke auch, daß der Child-Process die Eine oder Andere davon benötigen könnte, z.B. COMSPEC oder auch PATH.

    Oder bin ich nun auf dem Holzweg?



  • Ah nun hab ich begriffen auf was du hinaus willst. Ich dachte ich kann bei CreateProcess() alle Variablen wie "param=wert;param=wert;param=wert" angeben, stattdessen benötige ich ja lauter Einzelstrings.

    Klar, das sieht nach mehr Aufwand aus als immer brav und schön mit einer Funktion zu setzen und dann zu erben.

    Aber ist das nicht unsauber? Vor allem kommt es zu Problemen wenn eine Umgebungsvariable unterschiedlich gesetzt werden muss?

    MfG SideWinder



  • SideWinder schrieb:

    Aber ist das nicht unsauber?

    Nö, wieso?

    Vor allem kommt es zu Problemen wenn eine Umgebungsvariable unterschiedlich gesetzt werden muss?

    Dann geht das in so einfach natürlich nicht mehr. Aber wie oft kommt denn das bei Dir vor?


Anmelden zum Antworten