Frage

Ich habe diesen kleinen Fehler zu beheben. Zuerst lassen Sie uns sprechen über eine kleine Tatsache: In CLI unter Windows können Sie nicht ein Programm mit einem Raum in seinem Weg laufen, es sei denn entgangen:

C:\>a b/c.bat
'a' is not recognized as an internal or external command,
operable program or batch file.

C:\>"a b/c.bat"

C:\>

Ich verwende proc_open ... proc_close in PHP einen Prozess (Programm) laufen, Beispiel:

function _pipeExec($cmd,$input=''){
    $proc=proc_open($cmd,array(0=>array('pipe','r'),
        1=>array('pipe','w'),2=>array('pipe','w')),$pipes);
    fwrite($pipes[0],$input);
    fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]); // max execusion time exceeded ssue
    fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    $rtn=proc_close($proc);
    return array(
        'stdout'=>$stdout,
        'stderr'=>$stderr,
        'return'=>(int)$rtn
    );
}

// example 1
_pipeExec('C:\\a b\\c.bat -switch');
// example 2
_pipeExec('"C:\\a b\\c.bat" -switch');
// example 3 (sounds stupid but I had to try)
_pipeExec('""C:\\a b\\c.bat"" -switch');

Beispiel 1

  • ERGEBNIS: 1
  • STDERR: 'C: \ a' wird nicht als interner oder externer Befehl erkannt, bedienbare Programm oder Batch-Datei.
  • STDOUT:

Beispiel 2

  • ERGEBNIS: 1
  • STDERR: 'C: \ a' wird nicht als interner oder externer Befehl erkannt, bedienbare Programm oder Batch-Datei.
  • STDOUT:

Beispiel 3

  • ERGEBNIS: 1
  • STDERR. Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch
  • STDOUT:

Sie sehen also, entweder Fall (doppelte Anführungszeichen oder nicht) nicht den Code. Ist es mir oder bin ich etwas fehlt?

War es hilfreich?

Lösung

Die meist leider nicht das Update nicht wie erwartet funktionieren, aber Pekka erster Vorschlag gab mir eine Idee:

$file='C:\a b\c';
$cmdl='/d /b /g';

if(strtolower(substr(PHP_OS,0,3))=='win') // if windows...
    $file='cd '.escapeshellarg(dirname($file)).' && '.basename($file);

_pipeExec($file.' '.$cmdl);

Dies ist plattformspezifisch, und ich hoffe, ich habe nicht so gut diese über Linux zu beheben. Bisher funktioniert es gut!

Andere Tipps

Ein andere Möglichkeit, dies zu lösen ist, indem sie zusätzliche doppelte Anführungszeichen am Anfang und am Ende des Befehls.

$process = 'C:\\Program Files\\nodejs\\node.exe';
$arg1 = 'C:\\Path to File\\foo.js';

$cmd = sprintf('"%s" %s', $process, escapeshellarg($arg1));
if (strtolower(substr(PHP_OS, 0, 3)) === 'win') {
    $cmd = '"'.$cmd.'"';
}

_pipeExec($cmd);

Ich habe diese Lösung gefunden auf https://bugs.php.net/bug. php? id = 49139
Es sieht seltsam, aber hey - es ist von Windows ...: D

Dies ist strage.

Ungeprüfte Abhilfe Ideen:

  • Verwenden Sie eine temporäre Umgebungsvariable:

    exec('SET ENVPATH="C:\a b"');
    proc_open('%ENVPATH%\c.bat' ....
    

    (keine Ahnung, ob dies für proc_open funktioniert)

  • Mit dem 8.3-Dateinamen, wenn das irgendwie in PHP abgerufen werden kann - sicherlich machbar wäre eine andere exec() mit

  • proc_open() hat eine Option auf Bypass cmd.exe - könnte sich lohnen, einen Versuch, falls das Dateisystem irgendwie die Anführungszeichen anders behandelt

  • Versuchen Sie, die Anführungszeichen zu entkommen \"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top