如何使用PowerShell更改msi的产品代码?

时间:2016-12-13 12:06:34

标签: powershell wix windows-installer

我们正在使用基于Wix的msi并安装基于屏蔽的Msi。对于基于wix的msi,我更改了Wxs文件中的产品代码,因此根据我的需要更改了产品代码。

但对于installshield msi,我不能这样做。我探索了Iscmdbld.exe选项来更改产品代码但没有帮助。

有些博客说使用Wix 4.0&WixToolset.Dtf.WindowsInstaller.dll'。但我没有找到Wix 3.10.3的这个程序集。

我还有其他方法可以使用PowerShell更新产品代码吗?

1 个答案:

答案 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();