首页 > 解决方案 > 如何在 C# 中显示 cmd 的多行输出

问题描述

我需要我的 c# 程序运行 cmd 查询以显示所有 sql 服务,然后将它们显示在消息框中。在我将要运行它的情况下,经常会有不止一个,而且每次的名称可能都不同。

“Wmic service where (PathName like '%Binn\sqlservr%') get caption, name”显示我需要的信息,但返回多行。WriteNote() 方法是将信息写入程序中的文本框的方法。

我已经尝试了所有可以在 Google 上找到的东西,但似乎没有任何效果。

    private void DoListSQLServices()
    {
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = "Wmic service where (PathName like '%Binn\\sqlservr%') get caption, name";
        process.StartInfo = startInfo;
        startInfo.RedirectStandardOutput = true;
        startInfo.UseShellExecute = false; 
        process.Start();
        string output = process.StandardOutput.ReadToEnd();

          this.WriteNote(output);
        process.WaitForExit();             
    }

当我运行这段代码时,我得到了这个:

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。版权所有。

{项目文件位置}\bin\Debug>

并且在调试文件夹中放置了一个 pbd 文件。

我想要的是它显示 SQL 服务的标题和名称,就像您通过 cmd 手动运行该命令一样。最终,用户将键入其中一个以让程序重新启动它们,但我宁愿让程序显示列表,也不愿让用户转到 Windows 中的服务并手动搜索它们。

提前致谢!

标签: c#cmdoutput

解决方案


正如 Noodles 在评论中提到的,最好通过 .NET 中的 WMI 支持来做到这一点。一种相当直接的方法是使用ManagementObjectSearcher该类来ObjectQuery针对 WMI 数据执行。

创建一个新的控制台应用程序。将程序集的引用添加到文件顶部System.Management并添加using System.Management;program.cs文件顶部。

现在添加以下代码:

static void Main()
{
    // Create a scope (connection to WMI)
    var scope = new ManagementScope(@"\\localhost\root\cimv2");

    // Create query
    var query = new ObjectQuery(@"SELECT Name,Caption FROM Win32_Service WHERE PathName like '%Binn\\sqlserv%'");

    // Create a search to run the query against the scope
    using (var search = new ManagementObjectSearcher(scope, query))
    {
        // Iterate through the query results
        foreach (var item in search.Get())
        {
            // get values, all strings in this case
            string name = (string)item["Name"];
            string caption = (string)item["Caption"];
            Console.WriteLine("{0}\t{1}", name, caption);
        }
    }
}

请注意,ObjectQuery查询语法与 WMIC 语法略有不同。它被称为 WQL(WMI 查询语言),并且在很大程度上以 SQL 为模型。

希望您可以轻松地调整以上内容以供您自己使用。请注意您要获取的字段的实际类型。 这是Win32_Service 对象的属性列表。


推荐阅读