hawkmaster: system() Pfad mit Leerzeichen, maskieren

Hallo zusammen,

ich möchte einen system() Befehl ausführen. Das klappt bei folgendem Pfad:

$last_line = system("C:\Programme\htdocs\helper\pdfinfo "$ordner/$file"", $retval);

Wenn das Verzeichnis jedoch Leerzeichen hat wie;

$last_line = system("C:\Program Files\Common Files\pdfinfo "$ordner/$file"", $retval);

funktioniert es nicht mehr.
Ich habe schon alle möglichen Maskieren versucht:

$last_line = system(""C:\Program Files\Common Files\pdfinfo" "$ordner/$file"", $retval);

oder

$last_line = system("'C:\Program Files\Common Files\pdfinfo "$ordner/$file"", $retval);

oder

$last_line = system("""C:\Program Files\Common Files\pdfinfo"" "$ordner/$file"", $retval);

Alle klappt nicht. Der Befehl wird nicht ausgeführt.
Jemand eine Idee?
vielen Dank und viele Grüße
hawk

  1. Hallo,

    ich möchte einen system() Befehl ausführen. Das klappt bei folgendem Pfad:
    $last_line = system("C:\Programme\htdocs\helper\pdfinfo "$ordner/$file"", $retval);

    okay, das riecht stark nach Windows. ;-)
    Wobei mich überrascht, dass du die Endung .exe weglässt (darf man in vielen Fällen, ich setze aber gewöhnlich die Dateinamen vollständig ein). Ebenso wundert mich, dass du Backslashes und normale Vorwärts-Slashes gemischt verwendest.

    Wenn das Verzeichnis jedoch Leerzeichen hat wie;
      $last_line = system("C:\Program Files\Common Files\pdfinfo "$ordner/$file"", $retval);
    funktioniert es nicht mehr.

    Richtig, dann wird Windows alles bis zum ersten Leerzeichen als Programmnamen interpretieren, und der Aufruf scheitert logischerweise. Btw, wie äußert sich "funktioniert nicht"? Gibt system() als Ergebnis false zurück? Wird der Kind-Prozess gestartet (Task-Manager beobachten)?

    Ich habe schon alle möglichen Maskieren versucht:
      $last_line = system(""C:\Program Files\Common Files\pdfinfo" "$ordner/$file"", $retval);

    Genau so will es Windows aber normalerweise haben: Pfadnamen, die Leerzeichen enthalten, müssen in Anführungszeichen gesetzt werden.

    $last_line = system("""C:\Program Files\Common Files\pdfinfo"" "$ordner/$file"", $retval);

    Doppelte Anführungszeichen? Huch ...

    So long,
     Martin

    --
    Success should be measured not so much by the position that one has reached in life,
    but by the obstacles one has overcome while trying to succeed.
    1. Hi!

      $last_line = system("""C:\Program Files\Common Files\pdfinfo"" "$ordner/$file"", $retval);

      Doppelte Anführungszeichen? Huch ...

      Ja. Siehe Benutzerkommentar im PHP-Handbuch von luko post cz. Allerdings muss nach seiner Aussage das abschließende doppelte " nicht hinter den Befehl, sondern hinter die Argumente.

      Lo!

      1. Hallo,

        $last_line = system("""C:\Program Files\Common Files\pdfinfo"" "$ordner/$file"", $retval);
        Doppelte Anführungszeichen? Huch ...
        Ja. Siehe Benutzerkommentar im PHP-Handbuch von luko post cz. Allerdings muss nach seiner Aussage das abschließende doppelte " nicht hinter den Befehl, sondern hinter die Argumente.

        ja, ich verstehe was er meint, aber mir leuchtet das dennoch nicht ein. Denn wenn ich aus einer beliebigen anderen Anwendung oder sogar aus einer Windows-Verknüpfung heraus cmd.exe mit einer Folge von Parametern aufrufe, brauche ich auch per se erstmal keine Anführungszeichen:

        cmd.exe /c notepad.exe C:\Windows\dummy.txt

        Diesen String kann ich, so wie er dasteht, an Windows zur Ausführung übergeben.

        Warum "luko post cz" vorschlägt, hier den String "notepad.exe C:\Windows\dummy.txt" insgesamt in Anführungszeichen zu setzen, ist mir schleierhaft. Und auch PHP braucht dem Argument von system() doch bloß noch die Zeichenfolge cmd /c voranzustellen, und den resultierenden String an die OS-Funktion exec() zu übergeben.

        So long,
         Martin

        --
        Eine Neandertaler-Sippe sitzt in ihrer kalten Höhle. Seufzt der Stammesälteste: "Hoffentlich erfindet bald jemand das Feuer!"
        1. Hi Martin!

          cmd.exe /c notepad.exe C:\Windows\dummy.txt

          Diesen String kann ich, so wie er dasteht, an Windows zur Ausführung übergeben.

          Es geht um Pfade, die Leerzeichen enthalten. Versuch mal, das da per Konsole auszuführen:

          cmd.exe /c C:\Programme\Mozilla Firefox\firefox.exe -parameter

          oder auch nur:

          C:\Programme\Mozilla Firefox\firefox.exe

          Ergebnis in beiden Fällen:

          Der Befehl "C:\Programme\Mozilla" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

          mfG
          Benjamin

          --
          For animals, the entire universe has been neatly divided into things to (a) mate with, (b) eat, (c) run away from, and (d) rocks.
          1. Hallo Benjamin,

            cmd.exe /c notepad.exe C:\Windows\dummy.txt
            Diesen String kann ich, so wie er dasteht, an Windows zur Ausführung übergeben.
            Es geht um Pfade, die Leerzeichen enthalten. Versuch mal, das da per Konsole auszuführen:

            das war mir klar. Allerdings hat dedlfix auf einen User-Kommentar im PHP-Manual hingewiesen, nach dem der gesamte String noch einmal in Anführungszeichen zu setzen wäre, wenn er aus Programmname und zusätzlichen Argumenten besteht.

            C:\Programme\Mozilla Firefox\firefox.exe

            Der Befehl "C:\Programme\Mozilla" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

            Natürlein. Das hatte ich ja in meinem ersten Posting schon erläutert.

            Ciao,
             Martin

            --
            Der Klügere gibt solange nach, bis er der Dumme ist.
            1. Hi Der!

              Natürlein. Das hatte ich ja in meinem ersten Posting schon erläutert.

              Das hatte ich auch gelesen. So viel zu meiner Aufmerksamkeitsspanne. :-)

              mfG
              Benjamin

              --
              For animals, the entire universe has been neatly divided into things to (a) mate with, (b) eat, (c) run away from, and (d) rocks.
            2. Hello,

              das war mir klar. Allerdings hat dedlfix auf einen User-Kommentar im PHP-Manual hingewiesen, nach dem der gesamte String noch einmal in Anführungszeichen zu setzen wäre, wenn er aus Programmname und zusätzlichen Argumenten besteht.

              Das ist nicht verboten. Du kannst mit den Anführungszeichen sooft klammern, wie es Die Spaß macht, auch wenn dann eine Ebene Anführungszeichen überflüssig wird.

              Aber gab es nicht außerdem eine PHP-Funktion, die man nicht vergessen sollte?
              http://de.php.net/manual/en/function.escapeshellcmd.php

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
    2. Hallo Martin,

      danke dir für deine Hilfe,
      ich bin echt völlig ratlos. Als ob ich das zum ersten mal mache :-)
      Ich drehe mich gerade im Kreis. Ich habe so viele Varianten ausprobiert das glaubst du garnicht.
      Eigentlich sollte das doch funktionieren:

      So habe ich es versucht:
      $last_line = system(""C:\Program Files\Common Files\pdfinfo.exe" "$ordner\$file"", $retval);

      Ich habe sogar einen Prozess Explorer laufen. Es wird schon garnicht die Exe gestartet.

      okay, das riecht stark nach Windows. ;-)

      ja  Win XP

      Wobei mich überrascht, dass du die Endung .exe weglässt (darf man in vielen Fällen, ich setze aber gewöhnlich die Dateinamen vollständig ein).

      auch mit endung exe ändert sich nichts.

      Genau so will es Windows aber normalerweise haben: Pfadnamen, die Leerzeichen enthalten, müssen in Anführungszeichen gesetzt werden.

      auch so nicht:

      $last_line = system("'C:\Program Files\Common Files\pdfinfo.exe' "$ordner\$file"", $retval);

      Auch mit einfachen Hochkomma gehts nichts.

      $last_line = system('"C:\Program Files\Common Files\pdfinfo.exe" '.$ordner."\".$file.', $retval);

      vielen Dank und viele Grüße
      hawk

  2. Hi hawkmaster!

    $last_line = system(""C:\Program Files\Common Files\pdfinfo" "$ordner/$file"", $retval);

    Wie Martin bereits schrieb, sollte das eigentlich funktionieren. Versuch es mal mit Dateiendung.

    mfG
    Benjamin

    --
    For animals, the entire universe has been neatly divided into things to (a) mate with, (b) eat, (c) run away from, and (d) rocks.
    1. Hallo Benjamin,
      auch dir danke für deine Hilfe.

      $last_line = system(""C:\Program Files\Common Files\pdfinfo.exe" "$ordner/$file"", $retval);

      Wie Martin bereits schrieb, sollte das eigentlich funktionieren. Versuch es mal mit Dateiendung.

      Habe ich auch schon versucht.
      ich komme mir gerade vor, als ob ich das zum ersten mal mache :-)

      vielen Dank und viele Grüße
      hawk

  3. Hallo zusammen,

    Für alle die es interessiert:
    Es muss warum auch immer in doppelte Hochkomma rein.

    $last_line = system("""C:\Program Files\Common Files\test.exe" "$ordner\$file""", $retval);

    vielen Dank und viele Grüße
    hawk