1

为了在远程 VM 中找到已安装的 MSI 文件GUID - 我在内部使用以下命令Invoke-Command
Get-WmiObject Win32_Product | Where-Object {$_.Name -eq "Application Name"}
此命令在其输出中显示标识符号。
我知道,我应该在这个命令中再添加一件事,以便只获取 GUID,但我不知道如何......

现在,我需要将此 GUID 与我为安装获得的新 MSI 文件的 GUID 进行比较。

这意味着:
如果新文件的 GUID 较旧 -
如果新文件的 GUID 相同,我将不执行任何操作 -
如果新文件的 GUID 较新,我将不执行任何操作 - 我将进行升级或卸载安装过程...

因此,为了比较已安装的 MSI 的 GUID 和新的 MSI 文件的 GUID:找到
MSI 文件的 GUID 的确切PowerShell命令是什么?

4

2 回答 2

1

如果我理解正确,您想查找当前未安装的 MSI 的产品 G​​UID?我希望这是对您所问问题的正确理解。如果您需要从代码中自动获取产品 GUID,也是可以的。这里有一个完整的、独立的 VBScript,您可以将 MSI 文件拖放到其中以检索产品代码。

您可以通过使用合适的查看器打开 MSI 来找到产品代码 - 例如Orca,用于 MSI 包的 Microsoft SDK 工具。如果您安装了 Visual Studio,请尝试在Orca-x86_en-us.msi- 下搜索Program Files (x86)并安装它。然后在开始菜单中找到 Orca。您也可以右键单击 MSI 文件以使用 Orca 打开它们 - 只需选择:"Edit with Orca". 然后您可以在属性表中找到产品 GUID。

逆戟鲸

这是关于 MSI 查看器主题的答案(有几种选择,但总体而言 Orca 是最好的):如何比较两个(或更多)MSI 文件的内容?


MSI 有一个 Powershell 模块: https ://github.com/heaths/psmsi


链接:

于 2020-10-18T00:00:33.023 回答
0

我在远程 VM 和我的电脑中的“C:\Program Files\WindowsPowerShell\Modules”中安装了一个Carbon库,然后执行以下命令:

[string] $newMSIProductCode = (Get-CMsi -Path "C:\appName.msi").ProductVersion
[string] $newMSIProductCodeGUID = (Get-CMsi -Path "C:\appName.msi").ProductCode.Guid
$newMSIProductCode = $newMSIProductCode -replace '\.',''


Enter-PSSession -Computer $computer -Credential $credentials
Invoke-Command -Computer $computer -Credential $credentials -ScriptBlock {

   [string] $installedMSIProductCode = (Get-CProgramInstallInfo -Name "app name").DisplayVersion
   $installedMSIProductCodeGUID = (Get-CProgramInstallInfo -Name "app name").ProductCode.Guid
   [long] $installedMSIProductCode = $installedMSIProductCode -replace '\.',''

   if ($Using:$newMSIProductCodeGUID -gt $installedR10ServerBuildProductCode)
   {
      //TO-DO 
   }
}
于 2020-11-08T08:29:40.693 回答