我想让安装程序运行PowerShell脚本,然后再安装所有其他文件。但是,当前的构建方式仅在完成安装后才能运行脚本,因为它将powershell脚本放置在目标目录中。现在,可以通过使目录始终存在来解决此问题。但是,我不想一直都向脚本提供安装程序,我希望脚本被嵌入到安装程序中并从那里运行,或者至少运行脚本文件中的命令。
我曾尝试将自定义操作的“之后”更改为“ InstallInitialize”,但是会抛出一条错误消息,指出它无法建立路径(这是合乎逻辑的,因为尚未创建路径,因为脚本是在安装前执行的文件)。
这里有一些代码提供了运行powershell脚本的所有逻辑:
<DirectoryRef Id="INSTALLFOLDER">
<Component Id ="SOMESCRIPT" Guid="">
<File Id="SOMESCRIPT" Name="My-Script.ps1" Source="My-Script.ps1" />
</Component>
</DirectoryRef>
<Property Id="POWERSHELLEXE">
<RegistrySearch Id="POWERSHELLEXE"
Type="raw"
Root="HKLM"
Key="SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
Name="Path" />
</Property>
<Condition Message="This application requires Windows PowerShell.">
<![CDATA[Installed OR POWERSHELLEXE]]>
</Condition>
<SetProperty Id="PSscript"
After="PSscript"
Sequence="execute"
Value =""[POWERSHELLEXE]" -Version 3.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command "& '[#SOMESCRIPT]' ; exit $$($Error.Count)"" />
<CustomAction Id="PSscript"
BinaryKey="WixCA"
DllEntry="WixQuietExec"
Execute="deferred"
Return="check"
Impersonate="yes" />
<InstallExecuteSequence>
<Custom Action="PSscript" After="InstallInitialize"><![CDATA[NOT Installed]]></Custom>
</InstallExecuteSequence>
预期结果是将脚本嵌入到.msi文件中,而不依赖仅在安装后创建的文件。该错误消息是因为找不到脚本,所以找不到脚本。我实际上不希望脚本文件首先放在文件夹中,我只希望脚本在安装程序中运行,而对脚本文件不做任何其他操作。
我可以在网上找到Wix的This the only PS extension,但似乎这也可能仅限于您的情况。
为了在安装之前支持正在运行的脚本,我们(在Advanced Installer)创建了预定义的支持,以在安装启动时将PS脚本提取为临时文件并从该临时位置执行该脚本。如果Wix有类似的支持,我不会。
披露:我正在团队建设Advanced Installer。