【问题标题】:Run windows command in php在php中运行windows命令
【发布时间】:2013-07-23 17:00:15
【问题描述】:

是否可以从 php 运行 windows 命令行代码? 我的windows命令行代码是:

<?php 
error_reporting(E_ALL); 
try {

echo exec('C:\xampp\mysql\bin>mysqlbinlog --start-datetime="2011-04-21 10:31:44" c:\xampp\mysql\data\binlog\bin-log.000001 > c:\xampp\mysql\data\binlog\sql.txt');

} catch (Exception $e) {
echo $e->getMessage();
}

现在我想使用 system()exec() 等从 PHP 运行这段代码。 任何帮助表示赞赏。

【问题讨论】:

  • 尝试时会发生什么?
  • 有什么问题?两者中的任何人都可以使用它。
  • 我认为你可以使用 shell_exec 函数来实现这一点...如果 system() 和 exec() 不起作用

标签: php exec system


【解决方案1】:

看看使用计划任务是否有效。

我一直难以从 PHP 调用 powershell 脚本。 PHP 一直超时(不是所有的 powershell 命令;只有一些命令。可能与安全设置和 WAMP 的运行方式有关)。以下是一种解决方法。不优雅,但它完成了工作。在您的情况下,您只想运行一个普通的非 powershell 命令行命令,这将不会更简单,并且应该可以使用相同的方法。

至于我,我将 powershell 脚本称为 scheduledtask,如下所示(在 PHP 中):

$cmd = 'c:\wamp64\www\runme4.bat';

$cmd2 = 'SCHTASKS /F /Create /TN _notepad3 /TR "'.$cmd.'" /SC DAILY /RU INTERACTIVE';

shell_exec($cmd2);

shell_exec('SCHTASKS /RUN /TN "_notepad3"');

shell_exec('SCHTASKS /DELETE /TN "_notepad3" /F');

我必须将 powershell 命令放在 .bat 中的原因是双引号太多。单引号不起作用。这是我的 runme4.bat 的内容(注意两个点之间有一个空格。这个 poweshell 命令运行 ps1 脚本(该脚本称为 AppointmentsToday.ps1)并调用其中的函数。它里面的函数叫做Get-AppointmentsToday):

powershell -executionpolicy Bypass -noexit "..\Get-AppointmentsToday.ps1;Get-AppointmentsToday"

更具体地说,在我的情况下,powershell 脚本 是这样的(在 Outlook 2019 本地版本的默认日历和用户定义日历中查找今天的约会。仅获取包含以下内容的主题hashtag 或单词 'meeting'。将输出结果保存到 .txt 文件中):

Set-ExecutionPolicy Bypass -Scope CurrentUser -Force
Function Get-AppointmentsToday
{
 Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
 $olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
 $outlook = new-object -comobject outlook.application
 $namespace = $outlook.GetNameSpace("MAPI")
 $folder = $namespace.getDefaultFolder($olFolders::olFolderCalendar)
 $folder.items | Select-Object -Property Subject, Start

 foreach($customfolder in $folder.Folders)
    {
    $customfolder.items | Select-Object -Property Subject, Start
    }
} #end function Get-OutlookCalendar
 $todayStart = Get-Date -Hour 0 -Minute 0 -Second 0
 $todayEnd = Get-Date -Hour 23 -Minute 59 -Second 59
 Get-AppointmentsToday | where-object { $_.start -gt $todayStart -AND $_.start -lt $todayEnd -AND ($_.subject -ilike "*#*" -OR $_.subject -ilike "*meeting*") } | Out-File -FilePath \wamp64\www\AppointmentsToday.txt

当我自己进入Powershell,或者自己从命令行调用时,代码运行流畅。但是,一旦我尝试从 PHP 运行它或将其打包到 .EXE 中,脚本就无法完成。 PHP一直超时。我删除了所有行,然后逐行重新添加它们。一旦我取消注释这两行,从内存中,执行就停止了: $folder = $namespace.getDefaultFolder($olFolders::olFolderCalendar) $文件夹.items | Select-Object -Property Subject, 开始

scheduledtask 方法对我有用。希望我的方法可以帮助处于类似情况的人。如果其他 .EXE 应用程序无法使用正常方法加载,您也可以使用此 shedulestask 方法运行它们。我很高兴知道一种更好的做事方式。

【讨论】:

    【解决方案2】:

    以管理员身份运行命令提示符

    遍历到 DOC_ROOT 文件夹

    cd C:\xampp\htdocs
    

    使用下面的命令,

    php -S localhost:8080
    

    如果 DOC_ROOT 有不同的公用文件夹

    php -S localhost:8080 -t public public/index.php
    

    对我来说效果很好。

    确保将 php.exe 添加到环境路径中。

    【讨论】:

      【解决方案3】:

      如果您能够从命令行手动运行命令,但不能通过 WAMP,那么运行 Apache 服务的用户没有执行命令和二进制文件所需的权限(如果它与 GUI 相关)。

      默认情况下,Apache 服务运行在用户帐户下:nt authority\system

      按照以下步骤将其更改为您的自定义用户(具有管理权限的用户),

      1. 点击 Windows+R 打开运行
      2. 键入“services.msc”,打开 Windows 服务列表
      3. 查找并选择您的 apache 服务并打开其属性
      4. 转到登录选项卡并将帐户从“本地系统”更改为另一个用户/帐户
      5. 重新启动 Apache 服务

      编码愉快 :-)

      【讨论】:

      • 我必须使用管理员
      • @Black 您可以使用管理员凭据
      • 使用管理员后无法启动服务
      • 尝试以管理员身份使用命令行 PHP 进程。 stackoverflow.com/a/67910311/6862516
      【解决方案4】:

      我正在使用 wamp,唯一的解决方案如下:

      在控制面板/管理工具/服务中,搜索 wampapache64、httpd 或类似的东西。在登录选项卡上勾选“允许服务与桌面交互”

      希望这会有所帮助!

      【讨论】:

      • 我在控制面板中没有找到类似的东西。
      【解决方案5】:

      C:\xampp\mysql\bin&gt;mysqlbinlog 不是命令。

      我想你的意思是C:\xampp\mysql\bin\mysqlbinlog

      注意 &gt;\ 中的替换。

      &gt; 仅在命令提示符中作为分隔符(用于眼睛)可见,但除非您尝试重定向输出,否则不应像在命令中那样使用它。 (您稍后将再次执行此操作)。因此,只需将第一个 &gt; 替换为 \,您的命令就会运行。

      【讨论】:

      • 您是否遇到任何错误?在这种情况下,您不应该从 exec 得到任何回声。您正在将输出重定向到 sql.txt。在 mysqlbinlog 之前替换 \ 中的 > 后,它按预期工作。 (创建了一个 sql.txt)如果你想在浏览器中输出你应该删除&gt; c:\xampp\mysql\data\binlog\sql.txt
      【解决方案6】:

      如果您不能直接在 exec() 中运行该命令,那么您可以使用该命令制作一个批处理文件并将其放在您网站的根目录中。然后,只需运行:

      <?php echo exec("script.bat"); ?>
      

      【讨论】:

        【解决方案7】:

        试一试。或者,如果您想要一个沙盒示例,请尝试运行

        <?php echo exec("whoami");?>
        

        【讨论】:

        • 我使用这个 exec('C:\xampp\mysql\bin>mysqlbinlog --start-datetime="2011-04-21 10:31:44" c:\xampp\mysql\data \binlog\bin-log.000001 > sql.txt');
        • 您可以检查您的 php.ini 以查看是否允许 exec()。或者把error_reporting(E_ALL);在脚本的开头查看错误是什么。
        猜你喜欢
        • 2013-03-13
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多