如何获取系统上安装的软件产品列表.我的目标是遍历这些,并获得其中一些的安装路径.
PSEUDOCODE(结合多种语言:))
foreach InstalledSoftwareProduct
if InstalledSoftwareProduct.DisplayName LIKE *Visual Studio*
print InstalledSoftwareProduct.Path
Run Code Online (Sandbox Code Playgroud)
Dir*_*mar 12
您可以使用MSI api函数枚举所有已安装的产品.您将在下面找到执行此操作的示例代码.
在我的代码中,我首先枚举所有产品,获取产品名称,如果它包含字符串"Visual Studio",我检查InstallLocation属性.但是,并不总是设置此属性.我不确定这是否是检查的正确属性,或者是否有另一个属性始终包含目标目录.也许从InstallLocation酒店取回的信息对您来说足够了?
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
[DllImport("msi.dll", CharSet = CharSet.Unicode)]
static extern Int32 MsiGetProductInfo(string product, string property,
[Out] StringBuilder valueBuf, ref Int32 len);
[DllImport("msi.dll", SetLastError = true)]
static extern int MsiEnumProducts(int iProductIndex,
StringBuilder lpProductBuf);
static void Main(string[] args)
{
StringBuilder sbProductCode = new StringBuilder(39);
int iIdx = 0;
while (
0 == MsiEnumProducts(iIdx++, sbProductCode))
{
Int32 productNameLen = 512;
StringBuilder sbProductName = new StringBuilder(productNameLen);
MsiGetProductInfo(sbProductCode.ToString(),
"ProductName", sbProductName, ref productNameLen);
if (sbProductName.ToString().Contains("Visual Studio"))
{
Int32 installDirLen = 1024;
StringBuilder sbInstallDir = new StringBuilder(installDirLen);
MsiGetProductInfo(sbProductCode.ToString(),
"InstallLocation", sbInstallDir, ref installDirLen);
Console.WriteLine("ProductName {0}: {1}",
sbProductName, sbInstallDir);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以询问WMI Installed应用程序类:Win32_Products该类表示Windows Installer安装的所有产品.例如,以下PS脚本将检索由Windows Installer安装的本地计算机上安装的所有产品:
Get-WmiObject -Class Win32_Product -ComputerName .
Run Code Online (Sandbox Code Playgroud)
请参阅使用软件安装.将PS查询转换为等效的C#使用WMI API(换句话说,将WMI与.NET Framework一起使用)留给读者练习.