我们正在使用基于Wix的msi并安装基于屏蔽的Msi。对于基于wix的msi,我更改了Wxs文件中的产品代码,因此根据我的需要更改了产品代码。
但对于installshield msi,我不能这样做。我探索了Iscmdbld.exe选项来更改产品代码但没有帮助。
有些博客说使用Wix 4.0&WixToolset.Dtf.WindowsInstaller.dll'。但我没有找到Wix 3.10.3的这个程序集。
我还有其他方法可以使用PowerShell更新产品代码吗?
答案 0 :(得分:3)
因为在WiX 3.10.3中,这个库调用了Microsoft.Deployment.WindowsInstaller.dll。你很可能已经看到了这个article,它展示了如何在PowerShell和WiX库的帮助下编辑MSI,使用3.10.3中的Microsoft.Deployment.WindowsInstaller而不是WixToolset.Dtf.WindowsInstaller。
这是一个更改MSI ProductCode的脚本:
#Copy dll from WiX binary files (version 3.10.3)
# Add Required Type Libraries
Add-Type -Path "C:\Temp\Microsoft.Deployment.WindowsInstaller.dll"
# Open an MSI Database
$oDatabase = New-Object Microsoft.Deployment.WindowsInstaller.Database("C:\Temp\Bliss_LP_net.msi", [Microsoft.Deployment.WindowsInstaller.DatabaseOpenMode]::Direct);
#Create a Select Query against an individual property
$sSQLQuery = "SELECT * FROM Property WHERE Property= 'ProductCode'"
#Create and Execute a View object
[Microsoft.Deployment.WindowsInstaller.View]$oView = $oDatabase.OpenView($sSQLQuery)
$oView.Execute()
#Fetch the Result
$oRecord = $oView.Fetch()
$sProductCode = $oRecord.GetString(2)
#Display Retrieved Field
"ProductCode = $($sProductCode)"
#Generate new random guid
$newProductCode = "{$((New-Guid).guid)}"
"newProductCode = $($newProductCode)"
$oRecord.SetString("Value",$newProductCode)
$oView.Modify([Microsoft.Deployment.WindowsInstaller.ViewModifyMode]::Update,$oRecord)
#Close the Database
$oView.Close();
$oDatabase.Dispose();