我已经编写了一个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
)。我仍然不知道为什么这看起来是真的还是假的取决于系统。