我正在将一组php脚本从Window 2003 / PHP 5.2迁移到Windows 2012 R2 / PHP 5.6.7
在脚本中使用exec命令,例如复制文件。命令可能如下所示:
exec ('copy "C:\ftp\suppliername\upload\*.*" c:\somefolder\ >> output.log');
你可能会说有更好的方法可以复制文件,但我现在不想重建这些脚本。
我遇到的问题是,当没有要复制的文件时,错误“系统无法找到指定的文件”。现在显示了,而旧服务器上则不是这样。
如果只是在命令行上执行copy命令,则输出如下所示:
The system cannot find the file specified.
0 file(s) copied.
这与写入output.log的内容相同 显然,“复制的0个文件”在某处被抑制,但不是错误。
所以我的问题是,如何摆脱命令行上的错误?我认为这将是php.ini中的一些配置,但在比较旧服务器和新服务器的php.ini之后,我找不到任何本质区别。
我尝试了一些方法来抑制错误,但没有成功:
编辑:请不要标记为重复。在问我的问题之前,我确实看到了这个问题。那里给出的答案并没有解决我的问题。主要的问题是,为什么它之前有效,你会认为应该仍然可以在不修改脚本的情况下以相同的方式工作。
答案 0 :(得分:0)
我想这个字符串正在打印到stderr。 您可以尝试按照帖子https://stackoverflow.com/a/3823015/146003中的说明替换您的STDERR。
该帖子的基本部分包括以下几行:
fclose(STDERR);
(...)
$STDERR = fopen('error.log', 'wb');
然后你可以摆脱error.log。虽然我没有尝试,但您可以尝试打开NIL
(请参阅https://stackoverflow.com/a/313115/146003)
答案 1 :(得分:0)
尝试添加" 2>& 1"你的命令。
exec ('copy "C:\ftp\suppliername\upload\*.*" c:\somefolder\ >> output.log 2>&1');
这应该将错误输出重定向到output.log
答案 2 :(得分:0)
首先,您将复制命令的输出重定向到文本文件,因此不会输出到控制台。
这样做:
exec ('copy "C:\ftp\suppliername\upload\*.*" c:\somefolder\', $output);
var_dump ($output);