使用 Java ProcessBuilder 从 TaskScheduler 启动的进程运行可见应用程序

Posted

技术标签:

【中文标题】使用 Java ProcessBuilder 从 TaskScheduler 启动的进程运行可见应用程序【英文标题】:Running visible applications, using Java ProcessBuilder, from a process started by TaskScheduler 【发布时间】:2017-04-22 07:09:27 【问题描述】:

众所周知,在最新版本的 Windows 中通过 TaskScheduler 启动任务时,如果任务是“无论用户是否登录都运行”,那么该任务将不会以交互方式运行 - 即它不会启动 UI。

供参考,这是根据Microsoft,并在此SuperUser question和此*** question中突出显示:

您可以指定即使在触发任务时未登录计划运行该任务的帐户也应运行该任务。为此,请选择标有 Run 不管用户是否登录的单选按钮。如果选择此单选按钮,任务将不会以交互方式运行。要使任务以交互方式运行,请选择仅在用户登录时运行单选按钮。

但是,我的问题是由此而来的。

TaskScheduler 启动的任务是一个 Java 客户端应用程序, 可以指示运行进程 - 这些是通过 ProcessBuilder 运行的 在客户端应用程序中。因此,这个客户可以 应用程序被隐藏/不启动 UI - 实际上,没有 UI。

但是,如果通过 TaskScheduler 启动客户端应用程序以如上所述“运行用户是否登录”,则客户端应用程序中由 ProcessBuilder 启动的任何进程也无法交互运行/无法运行显示用户界面。这是一个问题,因为客户端启动的某些进程是 UI 应用程序。

我不确定为什么会这样,但实际上我正在尝试解决是否有解决方法 - 例如可以添加一些环境变量或属性以使(不可见)客户端启动可见进程。

有什么想法吗?

【问题讨论】:

通过创建一个新的一次性运行任务来启动所有这些 UI 版应用程序。这应该可以完成工作。 @glee8e - 你能详细说明你的建议吗?您似乎很有信心推荐一个可行的解决方案,但我不清楚您的建议或它如何解决问题。 我弄错了一些:我相信如果用户退出,UI-ed 应用程序不会启动。所以我给出了解决方案:创建一个以交互模式启动进程并在几秒钟后运行的任务。但是,如果您希望即使在用户注销时也能启动 UI-ed 应用程序,那么我不知道。我很抱歉。 【参考方案1】:

因此,我发现的解决方法是停止使用 TaskScheduler,而是创建一个脚本来启动我的应用程序,并在开始菜单 > 程序 > 启动文件夹中添加该脚本的快捷方式。

感谢HowToGeek上的这篇文章:

在 Windows 7 和更早版本的 Windows 上,“开始”菜单包含一个“启动”文件夹以简化此操作。

此文件夹在 Windows 8、8.1 和 10 上不再那么容易访问,但仍然可以访问。要访问它,请按 Windows 键 + R,在“运行”对话框中键入“shell:startup”,然后按 Enter。

您添加到“shell:startup”文件夹的快捷方式只会在您使用您的用户帐户登录时启动。如果您想在任何用户登录时使用快捷方式自行启动,请改为在“运行”对话框中输入“shell:common startup”。

由于我希望我的应用程序在系统启动时启动,而不是用户登录,所以我使用了“shell:common startup”链接。

以这种方式启动的应用程序 - 或者在我的情况下,由以这种方式启动的应用程序启动的应用程序 - 通过其 UI 可见和/或交互。

【讨论】:

以上是关于使用 Java ProcessBuilder 从 TaskScheduler 启动的进程运行可见应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中使用 ProcessBuilder 的问题

Java/python 使用 processBuilder

Java使用ProcessBuilder类调用外部程序

Java 沙盒和 ProcessBuilder

在 Java 中使用 ProcessBuilder 读取输出 git-bash

java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source) at org.apache.hadoo