我试图从NSIS安装程序以静默和异步方式执行批处理文件。我希望它是静默的,以防止用户关闭它,我希望它是异步的,以便安装程序将在批处理文件仍在运行时自动关闭。这个想法是批处理文件删除安装程序,作为实现自删除安装程序的一种方式。但这个问题是关于批处理文件的具体执行。
我可以使用nsExec::Exec
以静默方式执行批处理文件,并且可以使用Exec
异步执行批处理文件。我正在尝试使用ExecShell
来做这两件事,但它不起作用。无论我传递给它,show type参数似乎都会被忽略。要确认这不仅限于批处理文件和SW_HIDE
,我已尝试最小化打开一个简单的文本文件,但我仍然无法执行此操作。
ExecShell "" "path.txt" SW_SHOWMINIMIZED
ExecShell "open" "path.txt" SW_SHOWMINIMIZED
这两个选项都只是在普通的非最小化窗口中打开写字板(我的默认值)。我尝试过请求管理员权限和隐藏安装详细信息但似乎没有任何效果。我该怎么办?
答案 0 :(得分:1)
ExecShell
的语法为verb command_line [parameters [showmode]]
,即使您不想要它也不能省略参数参数,如果您执行ExecShell "" "path.txt" SW_SHOWMINIMIZED
则SW_SHOWMINIMIZED是给定的参数to" path.txt"。正确的语法是ExecShell "" "path.txt" "" SW_SHOWMINIMIZED
。
你可以ExecShell "open" "c:\path\batch.bat" "" SW_HIDE
但是如果某人默认情况下在文本编辑器中设置了批处理文件,那么这可能会中断。最好强制翻译:
InitPluginsDir
FileOpen $0 "$PluginsDir\batch.bat" w
FileWrite $0 "ping localhost$\r$\necho."
FileWriteByte $0 7 ; ASCII Bell so we know it is running even if hidden
FileWrite $0 "$\r$\n"
FileWrite $0 "ping localhost$\r$\n" ; Another ping so ASCII Bell actually makes a sound before the process quits
FileClose $0
ExpandEnvStrings $0 %COMSPEC%
StrCmp $0 "%COMSPEC%" 0 +2
StrCpy $0 "$SysDir\cmd.exe"
ExecShell "" '$0' '/C "$PluginsDir\batch.bat"' SW_HIDE
Abort "Done"