Nasıl düzgün PHP shell_exec boşluk işlemek için mi?

4 Cevap php

Ben cmd hattı üzerinden, win2003 sunucu PHP 526 koşuyorum.

Ben bir komut_satırı dizesi vardır:

$cmd = '  "d:\Prog Files\foo.exe" -p "d:\data path\datadir"  ';

Php kodunu bunun için çalışıyor

$out = `$cmd`;       # note use of backticks AKA shell_exec

Foo.exe tarafından bir başarısızlık sonuçlar, "d: \ data" olarak-p arg yorumlarken.

Ancak, pencerelerin kopyalanan aynı $cdm dize komut_satırı başarıyla yürütür kabuk.

Nasıl düzgün PHP boşluk yapmalıyım shell_exec?

4 Cevap

Argümanlar kaçmak için () escapeshellarg kullanın, (Ben Windows üzerinde tahmin ediyorum) tırnak işaretleri uygun bir kombinasyonu ile kaçış ve platformu için boşluk kaçtı gerekir.

Kaçtı olmak için tırnak içinde tırnak gerektirir Unix, aksine, Windows bu şekilde çalışmak için görünmüyor. O tırnak izler nasıl bana ötesinde, ama bu aslında aksine tüm mantık rağmen, iş gibi görünüyor:

$cmd = '" "C:\Path\To\Command" "Arg1" "Arg2" "';
$fp = popen($cmd, 'r');
$output='';
while ($l = fgets($fp, 1024))
$output.=$l;

Ben command.exe komut dizesi toplam alarak ve (aksi yedekli) dışında tırnak nixing tahmin ediyorum. Bu dış tırnak işaretleri olmadan, DOS bazı garip şeyler yapar. Bu çözüm user187383 tarafından yazılan benzer, ancak cmd / c ilk etapta kabuk çağrısı ile örtülü olduğundan, sadece, aslında hafif bir performans kesim ile birlikte neler obfuscates "cmd / c" ile ortadan kaldırıyor!

Bu ilginç bir sorundur. Görünüşe göre, PHP hem değil çift programı etrafında tırnak veya argümanlar koymak, ama sağlar. Bu bir hata olarak bu raporlama değer olabilir.

Etrafta bir iş DOS 8.3 adı yerine tırnak kullanmaktır. Örneğin, "C: \ Program Files \" genellikle "C: \ Progra ~ 1 C" olur.

De bu sorun vardı - cmd.exe üzerinden rota başlatılması için bir fikir geldi. Burada hile çift qoutes kaybolmak değildir. Genellikle size çalıştırmak istediğiniz bir şey koymak istiyorum:

exec('cmd /c " '.$path.' "';

$ Yol yürütülebilir bir zaten çift tırnaklı yoludur. Örnek:

$path = '"C:\Program Files\ToDoList Simple\ToDoList.exe" "C:\SomePath\todo.tdl" -nt test -cm test2';