NSIS 在卸载部分调用 PowerShell

NSIS Call PowerShell in Uninstall Section

我正在为我们将在大约一个月内获得的新 VPN 创建一个 NSIS 安装程序。我让它调用 PowerShell 脚本来毫无问题地创建连接。但是,删除 VPN 连接并不能使用相同的方法。下面是我所有的卸载代码

Section Uninstall
  ExpandEnvStrings [=10=] "%COMSPEC%"
  ExecShell "" '"[=10=]"' "/C powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\DeleteVPNConnection.ps1 -connectionName ${VPN_NAME} " SW_HIDE
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\CreateVPNConnection.ps1"
  Delete "$INSTDIR\DeleteVPNConnection.ps1"
  RMDir /r "$INSTDIR"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd

有没有人知道为什么卸载脚本不起作用(我也尝试删除 connectionName 参数,同样的问题)。

您的代码有两个问题:

  • 您正在指定一个相对的 .ps 文件路径。
  • ExecShell 不会等待,因此 .ps 文件可能会过早删除。

如果您使用的是 NSIS 3.02,则可以使用 ExecShellWait:

ExpandEnvStrings [=10=] "%COMSPEC%"
ExecShellWait "" '"[=10=]"' '/C powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File "$InstDir\DeleteVPNConnection.ps1" -connectionName ${VPN_NAME}' SW_HIDE

如果您使用的是较旧的 NSIS 版本,则必须使用 ExecWait(不隐藏控制台 window)或 nsExec plug-in.