php:使用exec命令而不输出到CLI

时间:2015-04-15 11:03:48

标签: php

我正在将一组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之后,我找不到任何本质区别。

我尝试了一些方法来抑制错误,但没有成功:

  • 在exec命令中添加@
  • 在命令
  • 之前和之后添加ob_start()和ob_end_clean()

编辑:请不要标记为重复。在问我的问题之前,我确实看到了这个问题。那里给出的答案并没有解决我的问题。主要的问题是,为什么它之前有效,你会认为应该仍然可以在不修改脚本的情况下以相同的方式工作。

3 个答案:

答案 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);