system() Pfad mit Leerzeichen, maskieren
hawkmaster
- php
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
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
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!
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
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
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
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
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
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
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
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
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