PHP 页面运行批处理文件,该文件运行应显示 GUI 但未显示的可执行文件

PHP page runs Batch file which runs an executable file that should show GUI but it does not

标题尽可能具体。我有一个 PHP 页面,它通过 exec 执行一个批处理文件,该文件将执行一个 python exe 将数据导出到 csv 并且应该通过 window 使用 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。它只是不会显示 window。另一个问题是一旦 php 文件执行批处理文件,页面将永远加载。我必须从 wamp 重新启动所有服务,以便我可以再次使用 python exe。如果我手动点击批处理文件,它会显示python exe的提示符window。 Prompt Window

我已经无休止地搜索了一个星期,但 none 对我有用。我浪费时间试图理解一些解决方案,因为它们没有深入细节。然而,问题仍然没有解决。拜托,任何人都可以一步一步地告诉我如何解决这个问题(每个步骤都有完整的描述)。提前致谢!

可能进程.exe 仍然是运行,我认为批处理文件不适用于该提案。我也认为你可以做不同的。

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

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

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

程序 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 所以这个我帮不了你。

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

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

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

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