繁体   English   中英

如何在c#中显示cmd的多行输出

[英]How to display a multi-line output from cmd in c#

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

“Wmic服务在哪里(PathName如'%Binn \\ sqlservr%')获取标题,名称”显示我需要的信息,但返回了多行。 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文件放在debug文件夹中。

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

提前致谢!

正如Noodles在评论中所提到的,通过.NET中的WMI支持来做这件事要好得多。 其中一个相当直接的方法是使用ManagementObjectSearcher类对WMI数据执行ObjectQuery

创建一个新的控制台应用程 添加System.Management程序集的引用并using 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对象的属性列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM