【问题标题】:Why is ExecShell ignoring my show type arguments?为什么 ExecShell 忽略我的显示类型参数?
【发布时间】:2018-10-11 21:05:58
【问题描述】:

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

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

ExecShell "" "path.txt" SW_SHOWMINIMIZED

ExecShell "open" "path.txt" SW_SHOWMINIMIZED

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

【问题讨论】:

  • 将 .txt 和 WordPad 混入其中是很不幸的,因为它依赖于 shell 注册,而 WordPad 也可以随意忽略您的请求。请发布一个简单的批处理文件示例(ping localhost 或其他)以及您如何执行该示例。另请告诉我们您的 Windows 版本。
  • 我使用的是 Windows 10。我认为文本文件和写字板是相当标准的,所以我不知道他们会破坏这个功能。外壳注册也可以在批处理文件中起作用吗?这真的取决于批处理文件的内容吗?
  • 如果您假设默认运行批处理文件而不是编辑它等,shell 注册也会弄乱批处理文件。批处理文件的内容并不重要,但它很方便如果其他人需要尝试重现您的问题。

标签: shell batch-file window nsis silent


【解决方案1】:

ExecShell 的语法是verb command_line [parameters [showmode]],即使你不想要它也不能省略parameters 参数,如果你这样做ExecShell "" "path.txt" SW_SHOWMINIMIZED 那么SW_SHOWMINIMIZED 是赋予“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"

【讨论】:

  • 感谢您的回答。需要明确的是,代码的重要部分是将 cmd.exe 作为命令传递给 ExecShell,将批处理文件作为参数传递,对吗?真的有必要看看 %COMSPEC% 是否等于 %COMSPEC% 吗?
  • 很遗憾 NSIS 手册中的 ExecShell 语法错误。
  • 不关心comspec(win95/98/me)的可以直接使用"$SysDir\cmd.exe"。据我所知,这些文档没有错,但它们可能更清楚。
  • 文档将参数和 showmode 放在同一级别,使它们都是可选的,而 showmode 不依赖于参数。 nsis.sourceforge.net/Docs/Chapter4.html
  • 恐怕大多数文档都使用该语法。我会看看我能做什么,或者至少添加一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 2011-05-18
  • 2014-07-08
相关资源
最近更新 更多