【问题标题】:Open batch file php [duplicate]打开批处理文件php [重复]
【发布时间】:2017-12-10 01:29:33
【问题描述】:

在每个人都开始讨论“安全风险”“无法完成”之前,请停下来阅读整个帖子

我有一个从家用笔记本电脑设置的网络服务器,它用作游戏网络服务器,我试图创建一个 GUI,这样我们更容易维护服务器,并且我试图使用批处理文件来执行操作电脑

所以从这个角度来看,我有我的索引文件 index.php

<form method="post">
  <input type="submit" name="startServer" value="Start Server">
</form>

<?
  if(isset($_POST['startServer'])){
    exec('batch/startServer.bat');
  }
?>

我的 startServer.bat 将在运行服务器的笔记本电脑上运行,并将执行所有必要的操作来启动我们的游戏服务器,因此存在另一个目录“Instance”,其中包含一个可执行的“Server.exe”,批处理文件将运行该目录

我遇到的问题是运行网络服务器并测试它如果我直接打开批处理文件它不起作用但似乎 php 代码不起作用

为了澄清,我使用的是 apache,我的浏览器是 chrome

对于任何愿意回答我正在走的路线的人来说,只是一个简单的问题是正确的,对吗?使用 php 将允许所有内容在托管服务器的机器上运行,因此最终用户将只能看到 GUI,而服务器将在 Web 服务器上运行批处理文件和所有内容,而不是在本地机器上运行(如果有意义的话)?

编辑:为了更清楚地了解函数 exec 运行的情况,但它就像应用程序正在加载一样挂起我需要一个实际打开应用程序的解决方案是我的主机,例如,如果我想打开记事本我按下 Web 服务器上的按钮,记事本将在计算机上打开

编辑 2:我想指出,我并不完全 需要 使用 exec 函数,我已经尝试了截至 7 月 19 日的所有答案/ 2017:3:45 pm 如果我在echo exec('start text.bat'); 上做某事,我将得到一个This is a test to show your batch is working 并且只是在批处理文件中有echo ..... 我遇到的主要问题是服务器没有实际显示像显示 GUI 这样打开的文件让我们以记事本为例

只要我的批处理文件在完成运行后关闭记事本,我就可以打开记事本并获得一些返回值,但是永远不会显示记事本的 GUI,这非常重要

我读过一些关于使用 apache 作为服务的文章,我很确定我是,但我知道 xaammp 有足够的权限,我已经选中了“允许 apache 与桌面交互”的框,但是没有 GUI弹出这就是我想我试图理解的要点是我需要显示 GUI 而不仅仅是将文件作为后台服务打开。

如果它使回答更容易,我愿意切换编程语言,如果有一种可以更轻松地做我想做的事情

【问题讨论】:

  • 是的,我什至尝试将批处理文件放在同一个文件夹中
  • @AlivetoDie 你不正确。 PHP 有一个短标签功能。只要在php.ini 文件中启用短标签,它就可以只写&lt;? 并且它工作得很好。在 php.ini 中设置:short_open_tag=On
  • 它的 php 7 你不必指定它
  • PHP 不需要任何特殊权限来运行 .bat 文件。关键是:.bat 包含的任何其他命令都需要哪些权限?
  • 一些事情...你说你希望它在服务器上运行,但你希望在你的客户端上打开一个编辑器(打开记事本是客户端的事情,而不是服务器端的事情)。此外,如果您的“startServer”需要任何类型的交互,那么这将不起作用,因为您无法与批处理文件交互(无论如何运行它的方式)。

标签: php windows batch-file


【解决方案1】:

您的理论是正确的,它将在服务器上运行,但是您可能会遇到直接从 php 运行应用程序的问题(使用此方法 afaik 它不会与 PHP 分离,并且 webapp 在应用程序运行时“挂起”)。

确保:打印/记录返回值。只是一个

<?php
  if(isset($_POST['startServer'])){
   echo exec('batch/startServer.bat');
  }
?>

可以为您指明正确的方向。您的发行版中可能已禁用 exec 功能。

使用

<?php

而不是

<? 

强烈建议在大多数发行版(wamp、xamp 等)中默认不启用 short_tags。

设置调试模式并打印所有内容以获取有关问题的信息:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

if(isset($_POST['startServer'])){
   echo exec('batch/startServer.bat');
}
?>

如果您没有任何响应,请尝试使用带有“hello world”的简单批处理文件来测试它是否有效。

请注意,权限和限制来自于php环境,批处理文件继承了运行PHP代码/Apache的相同权限(以mod_php为例)

【讨论】:

  • exec 函数没有任何问题,因为我了解到似乎我不能只是“移交”页面在文件“打开”时不断加载的分配,它可以读取文本文件并在几秒钟内返回我的电脑上最多但仍然没有打开我需要这些文件才能实际打开
  • 在批处理文件完成之前,执行程序不会返回 -> 页面将像仍在“加载”一样运行。除非您从以下内容开始,否则它不会在您的屏幕上打开控制台:stackoverflow.com/questions/17957076/…
  • 有没有更好的语言可以让我更轻松地完成这项工作?
  • 我不认为它只是一个语言选择,这个问题比简单的语言更改可以解决的问题要复杂得多。当然,也许有为此任务制作的软件,但它不太常见(从未见过这样的东西)。也许游戏服务器有一个管理网络服务器?
  • 确实如此!我几乎尝试了所有我能想到的人,我认为设置端口转发很难!
【解决方案2】:

在关于exec函数的php手册中有一个注释:

注意:如果一个程序是用这个函数启动的,为了让它 继续在后台运行,程序的输出一定是 重定向到文件或另一个输出流。不这样做会 导致 PHP 挂起,直到程序执行结束。

我认为“像应用程序正在加载一样挂起”是您的应用程序等待 bat 文件终止/关闭以获取输出结果

让我们尝试另一种方法,我发现它here,其概念是创建一个调度程序来执行您想要的程序并使用命令调用它。

希望得到帮助:

shell_exec('SCHTASKS /F /Create /TN _notepad /TR "notepad.exe" /SC DAILY /RU INTERACTIVE');
shell_exec('SCHTASKS /RUN /TN "_notepad"');
shell_exec('SCHTASKS /DELETE /TN "_notepad" /F');

如果这不起作用

检查你是否在php.ini里面声明了safe_mode = Off

【讨论】:

【解决方案3】:

从这里开始:

How do you run a .bat file from PHP?

您是否尝试过: system("cmd /c C:[path to file]");?

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @miken32 我确实包含了答案
  • 如果答案在那里,则将其标记为重复。
【解决方案4】:

您可能需要通过cmd, 运行它,例如:

system("cmd /c C:[path to file]");

或尝试以下选项

1.

<?php
exec('c:\WINDOWS\system32\cmd.exe /c START C:\Program Files\VideoLAN\VLC\vlc.bat');
?>

2.

当您使用exec() 函数时,就好像您打开了一个 cmd 终端并直接向它输入命令。

使用像这样的单引号$str = exec('start /B Path\to\batch.bat'); /B 表示 bat 将在后台执行,因此 php 的其余部分将在运行该行后继续执行,而不是 $str = exec('start /B /C command', $result); 执行 command 然后存储 result 以供以后使用。

<?php
 pclose(popen("start /B test.bat", "r")); die();
?>

【讨论】:

    【解决方案5】:

    我认为这是一个收容问题。

    如果您在 php 终止时在 iiswebuser 运行的 php 进程下运行应用程序,它将关闭 windows 中所有生成的子进程。使用start 命令可以非常快速地使用命令将应用程序从子进程包含中分离出来。

    if(isset($_POST['startServer'])){
        exec('start batch/startServer.bat');
    }  
    

    我解释的收容示意图(简单)

    • IIS(IIS 作为 IISUser 运行)
      • php(应用程序)
        • cmd.exe(批处理)

    使用 start 将它带到那棵树的根部

    • IIS(IIS 作为 IISUser 运行)
      • php(应用程序)
    • cmd.exe(批处理)

    【讨论】:

      【解决方案6】:

      Baim Wrong 在响应的第一部分是正确的:您必须重定向脚本的输出,否则您的 PHP 代码将挂起。此外,您必须在后台移动进程。

      这在 *nix 上很容易做到:

      system("/usr/local/bin/shell.sh >> /tmp/log.log 2>&1 &");
      

      我知道您可以在 Windows 上重定向输出,但不确定如何在后台移动进程。您应该查看 DOS 手册或尝试使用 power shell。

      【讨论】:

      【解决方案7】:

      您可以使用systemexec php 函数

      $path = __DIR__ . '/batch/startServer.bat';
      exec('cmd /c start ' . $path);
      

      $path = __DIR__ . '/batch/startServer.bat';
      $lastLine = system('cmd /c start ' . $path);
      

      【讨论】:

        【解决方案8】:

        您在直接从 exec 运行应用程序时遇到了一些问题。我在使用 exec 运行文件时遇到了同样的问题。它通过传递另一个参数2>&1来解决。

        exec('some_command 2>&1', $output);
        print_r($output);  // to see the response to your command
        

        检查输出see exec function打印的值

        <?php
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);
        $output = array();
        if(isset($_POST['startServer'])){
           exec('batch/startServer.bat 2>&1', $output);
           print_r($output);
        } else {
            echo "Not posted";
        }
        ?>
        

        【讨论】:

          猜你喜欢
          • 2022-01-20
          • 2018-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          相关资源
          最近更新 更多