【发布时间】:2012-01-30 16:31:58
【问题描述】:
我有这个命令:
exec(sprintf('%s %s dump_data output', escapeshellarg($apps . 'pdftk' . DIRECTORY_SEPARATOR . 'pdftk.exe'), escapeshellarg(self::winEscapeShellArgFix($file, array()))), $output);
sprintf 的结果是这样的:
"\\127.0.0.1\binary\win32\pdftk\pdftk.exe" "//127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf" dump_data output
从 exec 运行此命令不会产生任何结果,但如果我从 windows cmd 运行它,它将正常工作。在我尝试了数百万条命令后,我了解到问题在于 php 将 sprintf 输出中的反斜杠用作转义反斜杠:
**\\**127......
有人知道为什么会这样吗?我关闭了所有魔法。
编辑: 如果我会执行:
exec("\\127.0.0.1\binary\win32\pdftk\pdftk.exe //127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf dump_data output",$outarr);
或
exec('\\127.0.0.1\binary\win32\pdftk\pdftk.exe //127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf dump_data output',$outarr);
它不会起作用
EDIT2: 我调试,这不是一个转义问题,命令实际上很好,它似乎是一个执行问题,即没有返回输出。它可以在 iis 网络服务器中运行,但不能在另一个 iis 网络服务器中运行。
【问题讨论】:
-
请改写您的诊断。我不太明白“php 将 sprintf 输出中的反斜杠用作转义反斜杠。”谢谢!
-
"\\" 是网络共享的合适开头。你是说你只想要一个“\”?
-
是的,我想指向一个网络共享,但 "\\" 不起作用:结果是 \127.0.0.1,我不希望这样,即使我正在使用 escapeshellchars