如何将此PowerShell脚本转换为C#?-获取ItemProperty

如何将此PowerShell脚本转换为C#?-获取ItemProperty,c#,powershell,C#,Powershell,我可以使用以下PowerShell命令获取已安装应用程序的列表: Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName 在C#中,它不像我在PowerShell中看到的那样返回确切的列表,我需要它精确地显示PowerShell的输出。 它显示了与其他程序完全不同的列表 public void conf() { process p1 = ne

我可以使用以下PowerShell命令获取已安装应用程序的列表:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName
在C#中,它不像我在PowerShell中看到的那样返回确切的列表,我需要它精确地显示PowerShell的输出。 它显示了与其他程序完全不同的列表

public void conf() {
process p1 = new Process();
ProcessStartInfo psi1 = new ProcessStartInfo("powershell", "Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName");
psi1.RedirectStandardOutput = true;
psi1.CreateNoWindow = true;
p1.StartInfo = psi1;
p1.StartInfo.UseShellExecute = false;
p1.StartInfo.Verb = "runas";
p1.Start();
string output = p1.StandardOutput.ReadToEnd();
Console.WriteLine(output);
p1.WaitForExit(400);
}
我做错了什么? 谢谢

如果您谈论的是内容—如果您强制C#程序在Configuration Manager中以x64的形式运行,您将获得相同的输出。默认情况下(任何CPU),它从和x86注册表项读取数据。或者,如果您运行Powershell x86,您将获得与原始C#程序相同的结果


如果您同时查询HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*键和合并结果,您将得到整个列表。在这种情况下,请确保您的程序是x64

PowerShell中的stdout中的空格有些混乱,所以我刚刚将其删除

    static void Main(string[] args)
    {
        var lines = GetSoft("Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*")
            .Union(GetSoft("Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*"))
            .Distinct()
            .ToList();
        lines.Sort();

        foreach (var line in lines)
        {
            Console.WriteLine(line);
        }
        Console.WriteLine(lines.Count);

        Console.ReadLine();
    }

    public static IEnumerable<string> GetSoft(string key)
    {
        Process p1 = new Process();
        ProcessStartInfo psi1 = new ProcessStartInfo("powershell",
            key + " | Select-Object DisplayName")
        {
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };
        p1.StartInfo = psi1;
        p1.StartInfo.UseShellExecute = false;
        p1.StartInfo.Verb = "runas";
        p1.Start();
        var output = p1.StandardOutput.ReadToEnd();

        var result= output.Split('\r', '\n').Select(s => s.Trim()).Where(s => !String.IsNullOrWhiteSpace(s));

        p1.WaitForExit(400);
        return result;
    } 
}
static void Main(字符串[]args)
{
var lines=GetSoft(“Get-ItemProperty HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\\*”)
.Union(GetSoft(“Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*”)
.Distinct()
.ToList();
line.Sort();
foreach(行中的var行)
{
控制台写入线(行);
}
Console.WriteLine(行数);
Console.ReadLine();
}
公共静态IEnumerable GetSoft(字符串键)
{
流程p1=新流程();
ProcessStartInfo psi1=新的ProcessStartInfo(“powershell”,
键+“|选择对象显示名称”)
{
重定向标准输出=真,
CreateNoWindow=true
};
p1.StartInfo=psi1;
p1.StartInfo.UseShellExecute=false;
p1.StartInfo.Verb=“runas”;
p1.开始();
var output=p1.StandardOutput.ReadToEnd();
var result=output.Split('\r','\n')。选择(s=>s.Trim())。其中(s=>!String.IsNullOrWhiteSpace);
p1.外国退出(400);
返回结果;
} 
}

可能的重复项不是重复项。我在问我自己在C#中的代码。@Mainak这显然不是重复的,他让powershell工作,并问为什么C#using powershell不输出相同的代码。
Verb
只能在
UseShellExecute=true
时使用。因此,您的PowerShell实例不能作为管理员使用。另外请注意,在x64操作系统中,有两个
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\
键:一个用于x64,一个用于x86程序。我不是说我的输出空间有问题,我的意思是,它与我在PowerShell中得到的列表完全不同,我可以看到已安装的其他程序,而不是PowerShell中的确切列表。奇怪。当我将Configuration Manager中的“任意CPU”设置为x64时,它工作了,它显示了我的确切列表。但我如何在不将其设置为x64的情况下执行此操作?如何读取x86和x64?