Inno安装程序中从{app}执行PowerShell脚本失败,而从{tmp}执行的脚本正在运行

Inno安装程序中从{app}执行PowerShell脚本失败,而从{tmp}执行的脚本正在运行,powershell,inno-setup,Powershell,Inno Setup,我的安装程序在安装时运行PowerShell脚本来创建证书。在[文件]部分,我复制了两个PowerShell脚本(一个要安装,一个要卸载): [文件] 来源:“MyApp\Certs.ps1”;DestDir:“{tmp}\Neogen”;标志:忽略版本\ 权限:所有人已满 来源:“MyApp\UninstallCerts.ps1”;DestDir:“{app}”;标志:忽略版本\ 权限:所有人已满 安装证书的脚本使用临时目录,卸载脚本使用应用程序目录,该目录通常将其放入C:\Program

我的安装程序在安装时运行PowerShell脚本来创建证书。在
[文件]
部分,我复制了两个PowerShell脚本(一个要安装,一个要卸载):

[文件]
来源:“MyApp\Certs.ps1”;DestDir:“{tmp}\Neogen”;标志:忽略版本\
权限:所有人已满
来源:“MyApp\UninstallCerts.ps1”;DestDir:“{app}”;标志:忽略版本\
权限:所有人已满
安装证书的脚本使用临时目录,卸载脚本使用应用程序目录,该目录通常将其放入
C:\Program Files(x86)\MyApp
文件夹中。我可以确认卸载脚本是否被放入正确的文件夹中

卸载应用程序时,证书不会被卸载。脚本如下所示:

Get ChildItem Cert:\LocalMachine\My | Where Object{$\uuu.FriendlyName-match'MyCert}删除项
获取ChildItem证书:\LocalMachine\Root | Where对象{$\ FriendlyName-匹配'MyCert'}|删除项
如果我打开具有管理员权限的PowerShell窗口,并转到
C:\Program Files(x86)\MyApp
文件夹手动运行脚本,则脚本确实有效–证书将被删除。它只是在“添加/删除程序”窗口中运行卸载过程,但失败

Inno安装程序中的卸载代码如下所示:

[卸载运行]
文件名:“powershell.exe”\
参数:“-ExecutionPolicy Bypass-File”“{app}\UninstallCerts.ps1”“{app}”“”\
旗帜:runhidden;RunOnceId:“MyAppId”
卸载时尝试运行此PowerShell脚本时,我遗漏了什么

以下是如何执行证书创建脚本(确实成功运行)的语法:

[运行]
文件名:“powershell.exe”\
参数:“-ExecutionPolicy Bypass-File”“{tmp}\Certs.ps1”“{commonappdata}”“\
旗帜:runhidden

问题可能是
{app}
包含空格(
程序文件
?),而
{tmp}
不包含空格。您的语法无法正确处理带空格的路径

这是:


语法中的
是noop。它将
传递给PowerShell,PowerShell将其视为无

[Run]
Filename: "powershell.exe"; \
  Parameters: "-ExecutionPolicy Bypass -File ""{tmp}\Certs.ps1"" ""{commonappdata}""";\ 
  Flags: runhidden

[UninstallRun]
Filename: "powershell.exe"; \
  Parameters: "-ExecutionPolicy Bypass -File ""{app}\UninstallCerts.ps1"" ""{app}"""; \
  Flags: runhidden; RunOnceId: "MyAppId"