Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java内部在服务器上启动批处理文件?_Java - Fatal编程技术网

如何从Java内部在服务器上启动批处理文件?

如何从Java内部在服务器上启动批处理文件?,java,Java,是否可以允许客户端单击按钮,然后触发批处理文件在服务器上运行?我可以从服务器机器内部运行服务器上的批处理文件,但我想在服务器上运行,但从网站的客户端机器启动。我将如何做到这一点?问题在于客户机如何与服务器交互。无论如何,我假设是一个servlet应用程序,虽然它可能被认为是一个web应用程序,但您将拥有一个浏览器作为客户端,不是吗 因此,在收到该特定请求后,只需运行假定执行批处理文件的方法。问题在哪里。或者,我们可以详细说明您的应用程序的体系结构,以及客户端如何与服务器交互。是的,您可以 假设它

是否可以允许客户端单击按钮,然后触发批处理文件在服务器上运行?我可以从服务器机器内部运行服务器上的批处理文件,但我想在服务器上运行,但从网站的客户端机器启动。我将如何做到这一点?

问题在于客户机如何与服务器交互。无论如何,我假设是一个servlet应用程序,虽然它可能被认为是一个web应用程序,但您将拥有一个浏览器作为客户端,不是吗

因此,在收到该特定请求后,只需运行假定执行批处理文件的方法。问题在哪里。或者,我们可以详细说明您的应用程序的体系结构,以及客户端如何与服务器交互。

是的,您可以

假设它是一个web应用程序,您可以让一个JSP页面/Servlet执行与您在服务器机器上运行的相同的操作


唯一的问题是您可能必须异步执行它(即您的servlet将请求放入批处理任务的执行中)&返回以更新UI。如果批处理任务是长时间运行的,这一点尤其重要。

听起来您真正想要的是执行调用。例如:

    Runtime rt = Runtime.getRuntime();
    try {
        rt.exec("ifconfig");
    } catch (IOException e) {
        e.printStackTrace();
    }

从您的按钮点击或任何您正在触发事件的地方调用此选项。我不知道该如何取回任何东西,但那是另一回事

您可以使用ProcessBuilder从servlet调用批处理文件

 ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory("myDir");
 Process p = pb.start();
ProcessBuilder pb=newprocessbuilder(“myCommand”、“myArg1”、“myArg2”);
Map env=pb.environment();
环境看跌期权(“VAR1”、“myValue”);
环境移除(“其他变量”);
环境put(“VAR2”,环境get(“VAR1”)+“后缀”);
pb.目录(“myDir”);
进程p=pb.start();

编辑:始终可以使用p.getOutputStream()、p.getErrorStream()读取进程的stdout、stderr和返回代码。如果您需要在stdin上写入,请使用p.getInputStream()。

早在“应用程序服务器”出现之前,web服务器就已经基于客户端输入运行服务器端脚本了。这就是CGI的全部内容。不用说,当人们开始开发应用服务器时,他们肯定会在其中包含一些访问web开发人员已经习惯的CGI功能的方法

因此,您的问题的答案是,您几乎可以肯定地运行基于客户端输入的服务器端脚本。回答您的问题的问题是,您没有真正告诉任何人您的服务器端是什么。了解应用服务器所在的操作系统对于提供完整答案也很重要

因为您的问题是在Java标记下发布的,所以每个人都假设您的服务器端是某个J2EE应用程序服务器。如果是这样的话,那么到目前为止所有的答案都为你需要做什么提供了很好的线索。(如果您不是在应用服务器上运行,那么您需要查看web服务器的CGI功能(并将标记更改为CGI)。)

Scott的回答告诉您执行脚本或任何可执行文件的旧方法。卡莱塞的回答告诉你一种新的“犹太”方式。gnlogic和sagest您的应用服务器可能会为此提供内置API


gnlogic还提出了同步点。我无法对未知的应用程序服务器API发表评论,但Runtime.exec和ProcessBuilder都创建了一个异步进程。处理异步进程是一个完全不同的问题。

我错了吗,或者这个问题在过去几天里已经被问过很多次了?在服务器上运行的是什么服务,您想在其中执行批处理文件?如果从GUI调用它,这将不起作用,因为它将在客户端而不是服务器上启动进程。实际上,它将在服务器上运行,解释为“当在网站上单击按钮时”,而不是在java桌面客户端上。这意味着该代码将由servlet或类似程序执行。