我已經編寫了一個Web應用程序,它使用exec()來運行外部程序。程序路徑是可配置的,可以預期其名稱上有空格。衆所周知,Windows命令提示符接受文件名或參數中的空格,你只需要雙引號:exec():在Windows中引用完整命令
C:\>C:\Archivos de programa\GraphicsMagick-1.3.12-Q16\gm.exe
"C:\Archivos" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
C:\>"C:\Archivos de programa\GraphicsMagick-1.3.12-Q16\gm.exe"
GraphicsMagick 1.3.12 2010-03-08 Q16 http://www.GraphicsMagick.org/
到目前爲止這麼好。我面臨的問題是使用exec()PHP函數本身。某些Windows服務器要求在雙引號將完整的命令(程序+參數):
exec('""C:\Archivos de programa\GraphicsMagick-1.3.12-Q16\gm.exe" version"');
...和其他Windows服務器需要不用雙引號:
exec('"C:\Archivos de programa\GraphicsMagick-1.3.12-Q16\gm.exe" version');
我可以讀取PHP_OS
常量來檢測服務器是否運行Windows,但我不知道引號背後的規則或不引用主題。它如果在PHP手冊中解釋我找不到它。
是可以確定編程是否需要引號,所以我並不需要手動配置應用程序的每個實例?
更新#1:我被誤解了,所以我已經重新編寫了部分問題,使其更加清晰。
更新#2:我發現a comment in the PHP manual,解釋爲什麼需要額外的引號的確切原因(PHP發出內部呼叫cmd /c
)。我仍然不知道爲什麼這看起來是真的還是假的取決於系統。