簡體   English   中英

如何在PHP Shell_exec中正確處理空格?

[英]How do I to properly handle spaces in PHP Shell_exec?

我通過cmd-line運行win2003服務器,PHP 526。

我有一個cmdline字符串:

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

試圖在PHP代碼中執行此操作

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

foo.exe導致失敗,因為它將-p arg解釋為“d:\\ data”。

但是,復制到windows shell cmdline的相同$cdm字符串會成功執行。

如何在PHP shell_exec正確處理空格?

使用escapeshellarg()來轉義你的參數,它應該使用適當的引號和你的平台的轉義空格組合來逃避它(我猜你是在Windows上)。

與Unix不同,它需要在引號內引用才能進行轉義,Windows似乎不會以這種方式工作。 如何跟蹤報價是超出我的,但這實際上似乎有效,盡管所有邏輯相反:

$ cmd ='“”C:\\ Path \\ To \\ Command“”Arg1“”Arg2“”';
$ fp = popen($ cmd,'r');
$輸出= '';
while($ l = fgets($ fp,1024))
$輸出= $升。

我猜測command.exe正在使用命令字符串total並且修改(否則是多余的)外部引號。 如果沒有這些外部引用,DOS會做一些奇怪的事情。 這個解決方案與用戶187383類似,但是不使用“cmd / c”,它只會模糊實際發生的事情以及溫和的性能削減,因為cmd / c首先是shell調用所隱含的!

這是一個有趣的問題。 顯然,PHP允許你在程序或參數周圍加上雙引號,但不能同時使用兩者。 可能值得將此報告為錯誤。

解決方法是使用DOS 8.3名稱而不是引號。 例如,“C:\\ Program Files \\”通常變為“C:\\ Progra~1”。

有這個問題 - 提出了通過cmd.exe路由啟動的想法。 這里的訣竅是不要迷失在雙qoutes中。 通常,您希望放置要運行的任何內容:

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

其中$ path是可執行文件的雙引號路徑。 例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM