将任务安排到 运行 隐藏在 Inno Setup 中

Schedule task to run hidden in Inno Setup

我有一个使用 pyinstaller 创建的 exe 文件。我正在使用 Inno Setup 为此可执行文件创建 Windows 安装程序。

这是我的编译器脚本的一个片段:

Filename: "schtasks"; \
  Parameters: "/Create /F /SC MINUTE /MO 2 /TN ""Discovery"" /TR ""'{app}\Discovery.exe'"""; \
  Flags: runhidden runminimized

我正在使用 schtasks 来安排我的 exe 文件 (Discovery.exe) 的执行。调度工作得很好,但是当文件 运行 时命令行 window 仍然出现。这让我相信 runminimizedrunhidden

发生了一些奇怪的事情

Discovery.exe实际上是使用pyinstaller创建的命令行应用程序。

如何确保当此文件应该 运行 时不显示任何命令行 window?


Inno Setup 的最终工作 [运行] 声明基于@Bill_Stewart 的回答:

[Run]
Filename: "schtasks"; \
  Parameters: "/Create /F /SC MINUTE /MO 5 /TN ""Discovery"" /TR ""'wscript.exe' '{app}\RunHidden.js' '{app}\Discovery.exe' "" "; \
  Flags: runhidden runminimized;

由于我的文件路径中有空格,请注意引号的使用。

问题是 Inno Setup 的 [Run] 部分中的 runhidden 标志是 运行ning schtasks 命令,并且 schtasks 命令正在将您的程序 (Discovery.exe) 调度到 运行。安装包时,schtasks 命令 运行 根据要求隐藏,但这并不意味着您正在创建的计划任务将 运行 Discovery.exe作为隐藏进程。

如果您运行以当前用户身份执行计划任务,则任务计划程序没有“运行此任务已隐藏”设置。但是,您可以通过创建一个简短的 WSH 脚本来解决这个问题:

// RunHidden.js
// Runs a program in a hidden window
// Run this script using wscript.exe

var Args = WScript.Arguments;

if ( (Args.Unnamed.Count == 0) || (Args.Named.Item(0) == "/?") ) {
  WScript.Echo('Usage: wscript RunHidden.js "command"');
  WScript.Quit(0);
}

var FSO = new ActiveXObject("Scripting.FileSystemObject");
var Command = Args.Unnamed.Item(0);
if ( ! FSO.FileExists(Command) ) {
  WScript.Echo("File not found - " + Command);
  WScript.Quit(2);  // ERROR_FILE_NOT_FOUND
}

var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run('"' + Command + '"',0);

您可以随安装分发上述脚本。将wscript.exe作为程序调度到运行,上面的脚本和Discovery.exe作为参数,以及计划任务应该 运行 命令没有 window.