[PHP] exec functie werkt niet voor paden met spaties?!

Pagina: 1
Acties:

Onderwerpen


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 26-07 22:25
Hoi,

Ik draai een PHP script via de command line (PHP 5.0.4, Windows XP) om wat files te uploaden naar FTP. Maar zodra dat fout gaat, dan moet ik in een ander systeem een of andere status omzetten. Helaas kan PHP daar niet direct bij, maar is het wel mogelijk om via een soort API dat te doen. Echter dat gaat via een extern programma. Nu roep ik het volgende aan:

PHP:
1
exec( escapeshellarg( $GLOBALS["SYSTEM"]["SCRIPTENGINE"])." ".escapeshellarg( "-h")." ".escapeshellarg( $GLOBALS["SYSTEM"]["SERVERADDRESS"].":".$GLOBALS["SYSTEM"]["SERVERPORT"])." ".escapeshellarg( "-u")." ".escapeshellarg( $GLOBALS["SYSTEM"]["USERNAME"])." ".escapeshellarg( "-p")." ".escapeshellarg( $GLOBALS["SYSTEM"]["PASSWORD"])." ".escapeshellarg( $GLOBALS["SYSTEM"]["ERRORSCRIPT"])." ".escapeshellarg( $inJobID));


In de praktijk levert dat iets als dit op:
"C:\Program Files\System\ScriptEngine.exe" "-h" "localhost" "-u" "uid" "-p" "u" "C:\My Workflow\scripts\ErrorHandler.txt" "parameter"
Als ik dat via de commandline uitvoer is het geen enkel probleem. Echter PHP geeft de volgende foutmelding:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
Dat gebeurd eigenlijk zodra ik de parameters toevoeg, want alleen met ScriptEngine.exe dan wordt er wel wat aangeroepen.

Ik heb ook al de andere functies geprobeerd, shell_exec en system, maar die doen eigenlijk het zelfde...

Is er wellicht een functie om een short path te krijgen? Alternatief is eventueel om het weg te schrijven naar een batch bestand en dat uit te voeren... denk dat ik dat maar als work around doe, maarja, het is niet echt een oplossing...

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • software
  • Registratie: Mei 2003
  • Laatst online: 02-01 09:26
Moeten die " er wel staan ?
Denk dat dat niet nodig is. In de cmd (command prompt) zet je die " toch ook niet ?

[ Voor 8% gewijzigd door software op 28-12-2006 17:00 ]


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 26-07 22:25
software schreef op donderdag 28 december 2006 @ 17:00:
Moeten die " er wel staan ?
Denk dat dat niet nodig is. In de cmd (command prompt) zet je die " toch ook niet ?
Om de dingen met spaties moeten ze er zeker staan, ook in de command prompt. Als er geen spaties in staan dan hoeft het in principe niet, maar ik weet niet van te voren of ergens spaties in staan of niet, daarom zet ik overal maar quotes omheen.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • software
  • Registratie: Mei 2003
  • Laatst online: 02-01 09:26
Klopt niet wat ik zeg. Vergeet deze post
Kan je niet gewoon eens proberen met 1 parameter en die parameter zonder haakjes ?

[ Voor 152% gewijzigd door software op 28-12-2006 17:17 ]


  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
escape je quotation marks, dus ipv ." ". maak je er ."\" \"". van.

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
Doe eens escapeshellarg om de complete string, niet om elk argument.

Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

In Linux dien je iig de spaties ook te escapen, misschien dat je dit ook in Windows moet doen? (Nooit geprobeerd in Windows)

Verder wat misschien werkt; je kunt "Program Files" vervangen door "Progra~1" (Oude DOS notatie uit de tijd van Win95/98)


PHP:
1
2
3
4
<?php
$exe_file = str_replace("Program Files", "Progra~1", escapeshellarg( $GLOBALS["SYSTEM"]["SCRIPTENGINE"]));
exec( $exe_file." ".escapeshellarg( "-h")." ".escapeshellarg( $GLOBALS["SYSTEM"]["SERVERADDRESS"].":".$GLOBALS["SYSTEM"]["SERVERPORT"])." ".escapeshellarg( "-u")." ".escapeshellarg( $GLOBALS["SYSTEM"]["USERNAME"])." ".escapeshellarg( "-p")." ".escapeshellarg( $GLOBALS["SYSTEM"]["PASSWORD"])." ".escapeshellarg( $GLOBALS["SYSTEM"]["ERRORSCRIPT"])." ".escapeshellarg( $inJobID));
?>

[ Voor 3% gewijzigd door Rowdy.nl op 03-01-2007 15:34 . Reden: Te snel willen zijn :) ]

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Acties:
  • 0 Henk 'm!

Verwijderd

Rowdy.nl schreef op woensdag 03 januari 2007 @ 15:32:
In Linux dien je iig de spaties ook te escapen, misschien dat je dit ook in Windows moet doen? (Nooit geprobeerd in Windows)

Verder wat misschien werkt; je kunt "Program Files" vervangen door "Progra~1" (Oude DOS notatie uit de tijd van Win95/98)


PHP:
1
2
3
4
<?php
$exe_file = str_replace("Program Files", "Progra~1", escapeshellarg( $GLOBALS["SYSTEM"]["SCRIPTENGINE"]));
exec( $exe_file." ".escapeshellarg( "-h")." ".escapeshellarg( $GLOBALS["SYSTEM"]["SERVERADDRESS"].":".$GLOBALS["SYSTEM"]["SERVERPORT"])." ".escapeshellarg( "-u")." ".escapeshellarg( $GLOBALS["SYSTEM"]["USERNAME"])." ".escapeshellarg( "-p")." ".escapeshellarg( $GLOBALS["SYSTEM"]["PASSWORD"])." ".escapeshellarg( $GLOBALS["SYSTEM"]["ERRORSCRIPT"])." ".escapeshellarg( $inJobID));
?>
correct, in windows kun je ook spaties escapen. TS: maak dus van elke spatie een geescapete spatie (" " wordt "\ ")

Acties:
  • 0 Henk 'm!

  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
Rowdy.nl schreef op woensdag 03 januari 2007 @ 15:32:
In Linux dien je iig de spaties ook te escapen, misschien dat je dit ook in Windows moet doen? (Nooit geprobeerd in Windows)

Verder wat misschien werkt; je kunt "Program Files" vervangen door "Progra~1" (Oude DOS notatie uit de tijd van Win95/98)


PHP:
1
2
3
4
<?php
$exe_file = str_replace("Program Files", "Progra~1", escapeshellarg( $GLOBALS["SYSTEM"]["SCRIPTENGINE"]));
exec( $exe_file." ".escapeshellarg( "-h")." ".escapeshellarg( $GLOBALS["SYSTEM"]["SERVERADDRESS"].":".$GLOBALS["SYSTEM"]["SERVERPORT"])." ".escapeshellarg( "-u")." ".escapeshellarg( $GLOBALS["SYSTEM"]["USERNAME"])." ".escapeshellarg( "-p")." ".escapeshellarg( $GLOBALS["SYSTEM"]["PASSWORD"])." ".escapeshellarg( $GLOBALS["SYSTEM"]["ERRORSCRIPT"])." ".escapeshellarg( $inJobID));
?>
Converteren naar 8 bytes vind ik persoonlijk niet zo'n nette manier. Dan moet je alles gaan afvangen en daar moet toch een generieke oplossing voor bestaan. Zoals de post hierboven trouwens ook beschrijft :)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Als ik de manual bekijk gebruiken ze geen " maar '. Is hetgeen het zou moeten opleveren een aaname? Of heb je dat ook daadwerkelijk een keertje afgedrukt om te kijken of dat ook hetgene is dat eruit moet komen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

Mafkees schreef op woensdag 03 januari 2007 @ 20:01:
[...]

Converteren naar 8 bytes vind ik persoonlijk niet zo'n nette manier. Dan moet je alles gaan afvangen en daar moet toch een generieke oplossing voor bestaan. Zoals de post hierboven trouwens ook beschrijft :)
Is 't ook niet, maar mocht het escapen, zoals ik ook al zei, niet werken in Windows, is het misschien een laatse redmiddel... ;)

Nu ik de vraag nog eens lees;
^Mo^ schreef op donderdag 28 december 2006 @ 16:58:
...
Dat gebeurd eigenlijk zodra ik de parameters toevoeg, want alleen met ScriptEngine.exe dan wordt er wel wat aangeroepen.
...
Dacht ik aan iets wat ik tegenkwam in een andere (gerelateerde) functie in de manual, namelijk system:
dotmg at wikkàwiki dot ORG
10-Aug-2006 08:43
In system($command), $command cannot contain no more than two doublequotes. (At least with 4.3.3, on Windows). IF the path+executable name contains any space (and thus enclosed in double quotes).

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 /**
  * This example works fine, there is only 2 double quotes
  */
  system ("\"c:\\program files\\myapp\\myapp.exe\" params_for_myapp");
 /**
  * This one will fail, php will complain sthg like c:\\program is not an executable
  */
  system ("\"c:\\program files\\myapp\\myapp.exe\" \"One param for myapp that contains space\"");
  //
  /**
   * If you want your script to be able to run with older version of PHP (like 4.3.3), this is a trick:
   * Save the command in a temporary file and call that file
   */
  $tmpnam = tempname($writable_dir, "temp").".bat";
  $fp = fopen ($tmpnam, "w");
  fwrite($fp, $command);
  fclose ($fp);
  system($tmpnam, $status);
  unlink($tmpnam);
?>


Note: In my preview, backslashes were gone!
Misschien dat dit gerelateerd is aan jouw probleem?

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.

Pagina: 1