【问题标题】:PHP page runs Batch file which runs an executable file that should show GUI but it does notPHP 页面运行批处理文件,该文件运行一个可执行文件,该文件应该显示 GUI,但它没有
【发布时间】:2021-02-17 18:13:16
【问题描述】:

标题尽可能具体。我有一个 PHP 页面,它通过 exec 执行一个批处理文件,该文件将执行一个 python exe,将数据导出到 csv 中,如果交易成功,应该通过一个用 Mbox 制作的窗口提示用户。

PHP 脚本

$work = exec("START exec_export.bat",$output);
echo $work;
var_dump($output);

批处理文件

cd C:\wamp64\www\path\dist
START transfer_out_exporting.exe

Python 可执行文件

connection.close()
    cursor.close()
    Mbox('Export Succesful! ', 'File Name: '+file_name+".txt", 0)

然而,事实并非如此。幸运的是,它确实完成了 python exe 的预期任务。它将数据导出到 csv。它只是不会显示窗口。另一个问题是一旦 php 文件执行了批处理文件,页面将永远加载。我必须从 wamp 重新启动所有服务,以便我可以再次使用 python exe。如果我手动单击批处理文件,它将显示python exe的提示窗口。 Prompt Window

我已经无休止地搜索了一个星期,但没有一个对我有用。我浪费时间试图理解一些解决方案,因为它们没有详细说明。然而,问题仍然没有解决。拜托,谁能给我一步一步(每个步骤的完整描述)如何解决这个问题。提前谢谢!

【问题讨论】:

  • 不是解决方案,而是将批处理文件 cd 更改为 cd /D...
  • 这个问题太多了,我什至不知道从哪里开始。
  • @AlexBarker 一个很好的解释将不胜感激。至少,这是我对这个网站的期望,尤其是对拥有近 4000 名声望的人的期望。我相信我开始理解为什么 PHP 页面会永远加载。这是因为exe进程仍在运行,而windows进程由批处理文件处理。我必须结束这两个任务才能使页面停止加载并显示输出。我想我需要在导出完成后让 exe 和批处理脚本自行结束。

标签: python php batch-file exec exe


【解决方案1】:

好吧,既然这里没有像样的答案,我会试一试。

让我们从您的 python 脚本开始。如果您将此脚本用作自动过程,为什么它需要人工交互?我指的是你的成功提示窗口。这将阻止 python 代码返回,并且在有人手动单击对话框之前没有希望返回 PHP 执行。此外,您打算如何将该对话框中的 csv 文件路径返回到 PHP 甚至 csv 内容?这个 python 程序根本就不是在你的 PHP 代码或任何其他自动过程可以使用的原因中创建的。通常,您会使用 CLI 返回码(0 表示成功,!0 表示错误)来表示程序成功完成。如果通过 STDOUT 发送 CSV 输出,则可以更好地利用它,以便需要处理它的程序可以读取它。请参阅Unix philosophy 项目 #2。 “期望每个程序的输出成为另一个未知程序的输入。不要用无关信息使输出混乱。避免严格的列式或二进制输入格式。不要坚持交互式输入。”

您可能应该使用proc_open 或至少shell_exec 而不是exec。使用 proc_open 为您提供了一个可以与 fgetcsv 一起使用的资源,而无需文件和随之而来的所有卷积。

摆脱那个 bat 脚本。它很无聊,不可移植,只会给您的解决方案增加不必要的复杂性。

【讨论】:

  • 终于!谢谢你的实际回答。但是,我已经删除了 bat 文件并使用了 proc_open 昨天。我也摆脱了提示窗口,因为就像你说的那样,它阻止了 python 代码返回到 PHP。这次我使用 PHP 来提示用户是否导出完成。不过,我很欣赏这个答案。我已经通读并记住了所有内容
【解决方案2】:

可能进程 .exe 仍在运行,我认为批处理文件不适合该建议。我也认为你可以做出不同的事情。

首先,不要那样使用批处理文件:你需要做一个start /b,我想这将帮助你关闭.exe而不需要停止一切。

命令start 只是启动程序,你知道吗? start /b 使程序以批处理方式启动,这意味着:如果批处理关闭,则 exe 关闭。

如果这也不起作用,很简单:首先,将这两个程序都放入 PHP 代码中。而且,不要使用批处理,认真的!这是您在网站或其他东西中可以拥有的最不安全的东西,如果有人更改批处理命令,他们可以做任何事情。这并不难。

程序1

timeout /t (time in seconds that you think that the process of exportation gets) >nul
taskkill /f /im cmd* >nul

方案 2

cd C:\wamp64\www\path\dist
start /b transfer_out_exporting.exe

你也可以进入 cmd,导航到 wamp64\www\path\dist 并输入 transfer_out_exporting -htransfer_out_exporting /h 看看他们是否有这个选项,我不使用 wamp 所以我不能帮你解决这个问题。

【讨论】:

  • 也谢谢你的回答!我真的认为它会安全且有用,但话又说回来,我仍然是初学者。我会记住这一点。
  • 是的,伙计,我也在黑客方面工作,所以如果你不知道自己在做什么,那么一点点错误就会毁掉整个服务器,这只是我的建议。即使要使用批处理脚本,您也可以在进程中间使用 py 或 js 脚本,这是不可破坏的^^。
  • 我很乐意提供帮助^^
  • î 如果您可以投票并接受我的回答作为满意的回答,我将不胜感激^^
  • 我正在尝试投票,但它没有改变。我想我需要超过 15 个声望
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多