12

是否可以从 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();
}

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

4

7 回答 7

16

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

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

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

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

快乐编码:-)

于 2018-02-03T10:16:52.817 回答
7

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

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

希望这可以帮助!

于 2014-09-28T19:59:52.030 回答
2

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

<?php echo exec("script.bat"); ?>
于 2013-07-24T09:55:42.277 回答
0

C:\xampp\mysql\bin>mysqlbinlog不是命令。

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

>注意在 a 中的替换\

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

于 2013-07-24T11:00:40.150 回答
0

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

<?php echo exec("whoami");?>
于 2013-07-24T09:47:33.990 回答
0

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

遍历到 DOC_ROOT 文件夹

cd C:\xampp\htdocs

玩下面的命令,

php -S localhost:8080

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

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

它对我来说很好。

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

于 2021-06-09T19:07:39.847 回答
0

看看使用预定任务是否有效。

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

至于我,我将 powershell 脚本称为计划任务,如下所示(在 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 -今天的约会):

powershell -executionpolicy 绕过 -noexit "..\Get-AppointmentsToday.ps1;Get-AppointmentsToday"

更具体地说,在我的案例中, powershell 脚本是这样的(在本地版本的 Outlook 2019 的 detault 和用户定义的日历中查找今天的约会。仅获取包含主题标签或单词“会议”的主题。保存将结果输出到 .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) $folder.items | 选择对象 - 属性主题,开始

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

于 2021-10-11T23:22:00.937 回答