【问题标题】:Running a php script with a .bat file使用 .bat 文件运行 php 脚本
【发布时间】:2013-08-28 13:11:42
【问题描述】:

我需要在每晚午夜在我的服务器上运行一个 php 脚本。在 linux 系统上,我设置了一个 cron 作业,但我被 Windows 系统卡住了。

我知道我必须使用 Windows 任务调度程序设置一个任务,并且该任务需要运行一个 .bat 文件,该文件又将运行 php 文件,但我一直在尝试编写 .bat文件。

我目前拥有的是:

@echo off
REM this command runs the nightly cron job
start "C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php

但是当我尝试手动运行 .bat 文件来测试它时,我收到一个 Windows 警报提示

“Windows 找不到'-f'。请确保您输入的名称正确,然后再试一次。

我错过了什么?

【问题讨论】:

    标签: php windows batch-file


    【解决方案1】:

    START 命令可选地接受所创建窗口的标题作为其第一个参数;在这种情况下,它认为C:\Program Files (x86)\PHP\v5.3\php.exe 是要显示的标题,-f(第二个参数)是您要运行的可执行文件。

    因此,您可以通过提供占位符标题来解决此问题,例如

    start "email reminder task" "C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php
    

    或者,您最好完全放弃 START 命令(您没有使用它的任何独特功能),直接运行 PHP:

    "C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php
    

    【讨论】:

    • 只有一个问题,不要等到脚本结束
    • @a77icu5:好吧,在问题的上下文中这不是问题,无论如何,只有在您使用START 时才会发生(直接调用会等到 PHP 执行结束)。即使使用START,您也可以使用/WAIT 来匹配直接调用行为。
    • 如何让cmd窗口保持打开状态?假设我正在无限期地运行 Web 套接字的脚本。
    【解决方案2】:

    实际上,您甚至不需要批处理文件。 您可以从任务调度程序运行 php 脚本。

    只需让任务调度程序运行 php.exe 并将 php 文件的位置设置为任务的参数即可。

    【讨论】:

    • 完美运行。答案也很明显。不知道为什么我不首先尝试这个!
    • 完美运行。好主意!
    【解决方案3】:

    我可以建议一个小改动吗?

    echo off
    REM This adds the folder containing php.exe to the path
    PATH=%PATH%;C:\Program Files (x86)\PHP\v5.3
    
    REM Change Directory to the folder containing your script
    CD C:\inetpub\wwwroot\sitename\crons
    
    REM Execute
    php reminder-email.php
    

    PS。将 Apache、MySQL 或 PHP 放入 Program Files 是个坏主意。不要使用名称中带有空格的 windows 文件夹。

    【讨论】:

    • 我不确定为什么会选择以这种方式做事。比如为什么要CD到cron脚本目录?为什么要在 PATH 中添加一些东西,而不是在命令行中指定路径?最后,将内容放入 Program Files 有什么问题?我已经做了很多年了;只要您在需要时正确引用目录名称,当然就可以了。
    • 我正在使用预先存在的系统,因此文件结构超出了我的控制范围。
    【解决方案4】:

    这个怎么样?

    set php="C:\Program Files (x86)\PHP\v5.3\php.exe"
    %php% -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php
    

    【讨论】:

      【解决方案5】:

      遗憾的是,这需要将近 10 个小时才能弄清楚。某些协议(例如 WinRM 和 PSEXEC)必须传递登录的用户帐户,而不管提供的凭据如何(该凭据或 PHP 会覆盖您输入的任何内容)。无论如何,要获得 PSEXEC、WinRM 或只是启动连接到远程计算机的批处理文件,您需要将 IIS 运行帐户更改为有权访问这些资源的用户(服务帐户)。我意识到这是一个巨大的安全漏洞,但这是设计使然。 PHP 是安全的,因此不容易被黑客入侵,您必须通过指定运行身份帐户来覆盖其安全性。与您的应用程序池帐户不同 - 尽管您的 IIS 凭据可以使用您的应用程序池帐户。

      【讨论】:

        【解决方案6】:

        像这样尝试!

        cd E:\xampp\htdocs\my-project E: php工匠时间表:运行

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-09
          • 1970-01-01
          • 2011-09-30
          • 2017-11-17
          • 1970-01-01
          • 2016-11-14
          • 2022-11-12
          • 1970-01-01
          相关资源
          最近更新 更多