我想从Powershell脚本迁移到C#应用程序,但我无法从注册表中获取已安装应用程序的列表获得一致的结果。
我尝试了很多不同的方法来读取注册表,但它们都会导致相同的缺失项(与Powershell一起使用)。
Working Powershell示例:
$keys = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
$software = Get-ItemProperty $keys | where-object {$_.displayname -ne $null} | Where-Object {$_.displayname -like "*Zip*" } | Select-Object DisplayName
Write-Output $software.DisplayName
#results:
.\test.ps1
7-Zip 16.04 (x64)
我尝试了几个示例(大多数来自此站点),这是一个非工作C#示例的一个变体。我得到了结果,但并非所有项目都在列表中(见截图)。
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.LocalMachine;
Microsoft.Win32.RegistryKey subKey1 = regKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
string[] subKeyNames = subKey1.GetSubKeyNames();
foreach (string keyName in subKeyNames) {
if (keyName.IndexOf("Zip") > 0) {
Console.WriteLine(keyName);
}
}
Console.ReadLine();
#results are empty
我尝试了另一个非工作的c#示例:
string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) {
foreach (string subkey_name in key.GetSubKeyNames()) {
using (RegistryKey subkey = key.OpenSubKey(subkey_name)) {
if (subkey.GetValue("DisplayName") != null) {
Console.WriteLine(subkey.GetValue("DisplayName"));
}
}
}
}
Console.ReadLine();