在静默mod和特定目录中使用msiexec安装msi

时间:2014-08-08 11:29:27

标签: cmd windows-installer msiexec

我有setup.msi文件。我需要以静默方式从命令行运行安装。还需要指定此安装的路径。我尝试使用TARGETDIR和INSTALLDIR参数,但安装进入默认文件夹:

msiexec.exe /i c:\setup.msi TARGETDIR="c:\result" /qb

此外,如果再次运行此命令,则不会进行安装,因为msiexec认为该产品已安装。在这种情况下,我需要在指定的目录中安装产品,并且注册表中的版本值已经更新。

无论是否安装了产品,如何在特定目录中安装产品。

2 个答案:

答案 0 :(得分:4)

基本上,你的命令行没有错。但是,哪个变量是正确的,强烈依赖于msi包本身,TARGETDIR不起作用。至少它适用于遵循最佳实践的MSI文件。通常TARGETDIR是正确的,对于InstallShield-builds而言,INSTALLDIR效果最好。

但如果有人直接将文件夹作为ProgramFilesFolder创作,那么这是固定的。 下载Orca或更好的InstEd或类似工具,你必须查看MSI文件。

你的第二个问题: “无论是否安装了产品,我如何在特定目录中安装产品?”

这不是直接可行的。 Windows Installer具有规则,这些规则不允许在不同目录中进行多次安装而无需进一步努力: 此外,我不确定你为什么要这样:

以下是对此的更多了解:

  1. 通常,每个想要安装在其他目录中的人都会首先卸载该产品。这是标准做法。使用命令行参数/ x,您可以将其卸载。然后使用新路径安装。

  2. 您的说法是正确的,如果您使用(相同的)命令行再次安装,则不会发生任何变化或更改。可以使用修复(修正)代替卸载。使用附加参数 REINSTALL = ALL REINSTALLMODE = vemus 作为一个很好的默认值。 但正如所说,用这个来改变安装路径是不可能的。

  3. 如果你真的意味着这一点:因为在不同的目录中安装了同一软件的多个“副本”,MSI有点棘手。我推荐专业的MSI知识,所以也许你需要付费咨询。大多数人使用复制脚本而不是MSI来做这些事情。但是,如果要安装真正的多个安装版本,请搜索MSDN条目“使用实例转换安装多个实例”作为第一个起点。

答案 1 :(得分:0)

我使用powershell检查它是否已经安装,如果尚未安装,请安装它。

x86 MSI:

((Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Where { $_.DisplayName -like \"*[APPLICATION_NAME]*\" }) -ne $null)

X64 MSI:

((Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Where { $_.DisplayName -like \"*[APPLICATION_NAME]*\" }) -ne $null)

如果需要,可以获取结果并将其存储在变量中,例如$ ApplicationInstalled,然后根据结果对安装进行条件调整。

if (-not $ApplicationInstalled)
{
    #MSI Install Commmand
}