André Laugks: system() und exec() unter Windows

Hallo!

Ich versuche unter Windows ein Programm auf zurufen und an dessen Ausgabe zu kommen. Der Parameter "--noout" unterdrückt die Ausgabe des Dokumentenbaums. Auf der Konsole kommt es zu einer Ausgabe, weil die XML-Datei nicht vailde ist.

system("C:\xmllint\xmllint.exe --noout datei.xml", $string);
var_dump($string);

Als Ergebnis bekomme ich "int(1)" geliefert, also 1 = true. Denke ich mal... Auch bei Fehler im Pfad bekomme ich 1 geliefert.

Weil ich unter Windows mir nie so sicher mit dem Pfaden bin, habe ich es auch mit "C:/xmllint/xmllint.exe" versucht.

Bei meinen Recherchen habe ich gelesen, daß PHP als CGI installiert sein muß, was es auch ist. PHP ist als CGI installiert.

Apache: 1.3.28
PHP:    4.3.3
OS:     Win2000 SP4

MfG, André Laugks

--
L-Andre @ gmx.de
  1. Hallo,

    Wenn ich dich richtig verstanden habe, willst du an die Ausgabe des Programms rankommen. Das kannst du nicht mit system() - der Befehl liefert nur den "return status code", also eine Zahl, die je nach Betriebssystem signalisiert, ob das Programm korrekt ausgeführt und beendet wurde, oder ob es einen Fehler gab.

    Um die Ausgabe des gestarteten Programms zu bekommen, musst du exec verwenden (aus dem PHP Manual):

    string exec ( string command [, array output [, int return_var]] )

    exec() executes the given command, however it does not output anything. It simply returns the last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

    If the output argument is present, then the specified array will be filled with every line of output from the command. Line endings, such as \n, are not included in this array. Note that if the array already contains some elements, exec() will append to the end of the array. If you do not want the function to append elements, call unset() on the array before passing it to exec().

    If the return_var argument is present along with the array argument, then the return status of the executed command will be written to this variable.

    Mit freundlichen Grüßen,
    Michael Nagler

    1. Hallo!

      Um die Ausgabe des gestarteten Programms zu bekommen, musst du exec verwenden (aus dem PHP Manual):

      echo exec("c:\xmllint\xmllint.exe --noout datei.xml", $var_1, $var_2);

      var_dump($var_1);
      var_dump($var_2);

      Auch mit exec() bekomme ich keine Ausgabe. exec() hatte ich auch schon probiert.

      MfG, André Laugks
      --
      L-Andre @ gmx.de

      1. Hello,

        Auch mit exec() bekomme ich keine Ausgabe. exec() hatte ich auch schon probiert.

        Dann versuch mal die Backticks. Ich hab's selber aber noch nicht oft genug probiert...

        $ausgabe = consolenbefehl;

        Und dann soll angeblich in $ausgabe hinterher die komplette Ausgabe stehen. Wär nett, wenn Du's hier dann postest.

        Grüße

        Tom

        1. Hallo!

          $ausgabe = consolenbefehl;

          Und dann soll angeblich in $ausgabe hinterher die komplette Ausgabe stehen. Wär nett, wenn Du's hier dann postest.

          Bringt auch nichts!

          MfG, André Laugks

          1. Hello,

            $ausgabe = consolenbefehl;

            Und dann soll angeblich in $ausgabe hinterher die komplette Ausgabe stehen. Wär nett, wenn Du's hier dann postest.

            Bringt auch nichts!

            Und Umleitung der Standardausgabe in eine Datei?

            LG

            Tom

            1. Hallo!

              Und Umleitung der Standardausgabe in eine Datei?

              Die Option gibt es bei xmllint, es wird aber keine Datei angelegt! Keine Ahnung wieso...

              MfG, André Laugks

              --
              L-Andre @ gmx.de
              1. Hello,

                Und Umleitung der Standardausgabe in eine Datei?

                Die Option gibt es bei xmllint, es wird aber keine Datei angelegt! Keine Ahnung wieso...

                Fehlende Rechte für die Ausgabe. Welche braucht man denn, wenn man als wwwrun mit exec() ein Script aufruft? Ist dann der wwwrun der User des Scriptes? Ich denke schon. Und dann müsste der auch Schreibrechte für das Zielverzeichnis der Umlenkung haben.

                Versuchs doch erstmal auf der Konsole mur "su wwwrun"

                Grüße

                Tom

                1. Hallo!

                  Die Option gibt es bei xmllint, es wird aber keine Datei angelegt! Keine Ahnung wieso...

                  Fehlende Rechte für die Ausgabe. Welche braucht man denn, wenn man als wwwrun mit exec() ein Script aufruft?

                  siehe weiter unten...

                  Und dann müsste der auch Schreibrechte für das Zielverzeichnis der Umlenkung haben.

                  Ich habe es noch einmal versucht.

                  echo exec("c:\xmllint\xmllint.exe datei.xml > datei.txt", $var_1, $var_2);
                  var_dump($var_1);
                  var_dump($var_2);

                  var_1 + var_2 ->  array(0) { } int(0)

                  Gebe ich den Parameter "--noout" mit an, wird in die Datei nichts geschrieben, auch nicht die Fehlermeldung.

                  Es funktioniert also exec(), nur komme ich nicht an die Fehlermeldung ran.

                  Die Fehlermeldung wird also nicht mit in die Datei geschrieben.

                  Die Fehlermeldung sieht auf der Konsole folgendermaßen aus.

                  --------------------------------><8---------------------------------
                  C:\xmllint>xmllint.exe --noout datei.xml > datei.txt
                  datei.xml:75: validity error: ID m2 already defined
                          <element id="m2" typ="w">
                                                 ^

                  C:\xmllint>
                  -------------------------------><8----------------------------------

                  Versuchs doch erstmal auf der Konsole mur "su wwwrun"

                  Das soll unter Windows laufen...

                  MfG, André Laugks

                  --
                  L-Andre @ gmx.de
      2. Hallo,

        echo exec("c:\xmllint\xmllint.exe --noout datei.xml", $var_1, $var_2);

        Du musst die Backslashes auf jeden Fall escapen, also

        echo exec("c:\xmllint\xmllint.exe --noout datei.xml", $var_1, $var_2);

        Ob das dein Problem schon löst, weiß ich allerdings nicht. Viel Glück.

        Gruß,
        Andreas.

        1. Hallo!

          Du musst die Backslashes auf jeden Fall escapen, also

          Ob das dein Problem schon löst, weiß ich allerdings nicht.

          Neee löst auch nicht mein Problem.

          MfG, André Laugks