为什么 ExecShell 忽略我的显示类型参数?

Why is ExecShell ignoring my show type arguments?

我正在尝试从 NSIS 安装程序静默异步地执行批处理文件。我希望它保持静默以防止用户关闭它,我希望它是异步的,以便安装程序在批处理文件仍为 运行 时自动关闭。这个想法是让批处理文件删除安装程序,作为实现自删除安装程序的一种方式。但是这个问题具体是关于批处理文件的执行。

我可以使用 nsExec::Exec 静默执行批处理文件,我可以使用 Exec 异步执行批处理文件。我正在尝试通过使用 ExecShell 来完成这两项操作,但它不起作用。无论我传递给它什么,显示类型参数似乎都被忽略了。为了确认这不仅限于批处理文件和 SW_HIDE,我尝试打开一个最小化的简单文本文件,但我仍然无法打开。

ExecShell "" "path.txt" SW_SHOWMINIMIZED

ExecShell "open" "path.txt" SW_SHOWMINIMIZED

这两个选项都只是以正常的非最小化方式打开写字板(我的默认设置)window。我试过请求管理员权限并隐藏安装详细信息,但似乎没有任何效果。我能做什么?

ExecShell 的语法是 verb command_line [parameters [showmode]] 并且即使您不想要它也不能省略参数参数,如果您这样做 ExecShell "" "path.txt" SW_SHOWMINIMIZED 然后 SW_SHOWMINIMIZED是给"path.txt"的参数。正确的语法是 ExecShell "" "path.txt" "" SW_SHOWMINIMIZED.

您可以只执行 ExecShell "open" "c:\path\batch.bat" "" SW_HIDE,但如果有人将批处理文件设置为默认在文本编辑器中打开,这可能会中断。最好强制解释器:

InitPluginsDir
FileOpen [=10=] "$PluginsDir\batch.bat" w
FileWrite [=10=] "ping localhost$\r$\necho."
FileWriteByte [=10=] 7 ; ASCII Bell so we know it is running even if hidden
FileWrite [=10=] "$\r$\n"
FileWrite [=10=] "ping localhost$\r$\n" ; Another ping so ASCII Bell actually makes a sound before the process quits
FileClose [=10=]

ExpandEnvStrings [=10=] %COMSPEC%
StrCmp [=10=] "%COMSPEC%" 0 +2
StrCpy [=10=] "$SysDir\cmd.exe"
ExecShell "" '[=10=]' '/C "$PluginsDir\batch.bat"' SW_HIDE
Abort "Done"