【问题标题】:php: use exec command without output to CLIphp:使用 exec 命令而不输出到 CLI
【发布时间】:2015-04-15 11:03:47
【问题描述】:

我正在将一组 php 脚本从 Window 2003 / PHP 5.2 迁移到 Windows 2012 R2 / PHP 5.6.7

在脚本中使用 exec 命令,例如复制文件。命令可能如下所示:

exec ('copy "C:\ftp\suppliername\upload\*.*" c:\somefolder\  >> output.log');

您可能会争辩说有更好的方法来复制文件,但我不想现在重新构建这些脚本。

我遇到的问题是当没有要复制的文件时,错误“系统找不到指定的文件”。现在显示,而在旧服务器上不是这种情况。

如果只是在命令行执行复制命令,输出如下:

The system cannot find the file specified.
        0 file(s) copied.

这与写入 output.log 的内容相同 所以显然“0个文件被复制”在某处被压制,但不是错误。

所以我的问题是,我如何摆脱命令行上的错误?本来以为是php.ini里面的一些配置,但是对比了新旧服务器的php.ini,没发现有本质的区别。

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

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

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

【问题讨论】:

标签: php


【解决方案1】:

尝试将“2>&1”添加到您的命令中。

exec ('copy "C:\ftp\suppliername\upload\*.*" c:\somefolder\  >> output.log 2>&1');

这应该将错误输出重定向到 output.log

【讨论】:

    【解决方案2】:

    我想这个字符串正在打印到标准错误。 您可以尝试按照https://stackoverflow.com/a/3823015/146003 帖子中的说明替换您的 STDERR。

    帖子的基本部分由以下几行组成:

    fclose(STDERR);
    (...)
    $STDERR = fopen('error.log', 'wb');
    

    然后您可以摆脱 error.log。虽然我没试过,你可以试试打开NIL(见https://stackoverflow.com/a/313115/146003

    【讨论】:

      【解决方案3】:

      首先,您将复制命令的输出重定向到文本文件,因此不会输出到控制台。

      改为这样做:

      exec ('copy "C:\ftp\suppliername\upload\*.*" c:\somefolder\', $output);
      
      var_dump ($output);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-26
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多