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

时间:2016-04-12 06:48:53

标签: c# powershell

我可以使用此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);
}

我做错了什么? 感谢。

1 个答案:

答案 0 :(得分:2)

  

如果您正在谈论内容 - 如果您强制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;
    } 
}