计划任务在 Inno Setup 中隐藏运行

Posted

技术标签:

【中文标题】计划任务在 Inno Setup 中隐藏运行【英文标题】:Schedule task to run hidden in Inno Setup 【发布时间】:2021-08-20 16:54:15 【问题描述】:

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

这是我的编译器脚本中的一个 sn-p:

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

我正在使用schtasks 来安排我的 exe 文件 (Discovery.exe) 的执行。调度工作正常,但文件运行时仍会出现命令行窗口。这让我相信runminimizedrunhidden 发生了一些奇怪的事情

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

如何确保在该文件应该运行时不显示命令行窗口?


根据@Bill_Stewart 的回答,关于 Inno Setup 的最终工作 [Run] 声明:

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

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

【问题讨论】:

【参考方案1】:

问题在于 Inno Setup 的 [Run] 部分中的 runhidden 标志正在运行 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作为参数,调度任务应该无窗口运行命令。

【讨论】:

以上是关于计划任务在 Inno Setup 中隐藏运行的主要内容,如果未能解决你的问题,请参考以下文章

在 Inno Setup 中运行 schtask.exe 之前使用安装路径创建 XML 任务文件

Inno Setup区段之Tasks篇

inno setup里在[run]中如何使用install实现静默安装?

如何为一组任务确定计划,估计每个任务所需的时间?

Windows导出所有计划任务方法

inno setup如何做快速启动栏?