Как отобразить многострочный вывод из cmd в c # - PullRequest
0 голосов
/ 26 марта 2019

Мне нужна моя программа на 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] Copyright (c) 2009 Microsoft Corporation.Все права защищены.

{расположение файла проекта} \ bin \ Debug>

и файл pbd помещается в папку отладки.

Я хочу, чтобы он отображал заголовок и имя служб SQL, например, если вы запускаете эту команду через cmd вручную.В конечном итоге пользователь наберет один из них, чтобы программа перезапустила его, но я бы предпочел, чтобы программа отображала список, а не переходил к службам в окнах и осуществлял их поиск вручную.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 марта 2019

Как упомянул Noodles в комментариях, гораздо лучше сделать это через поддержку WMI в .NET. Одним из довольно прямых методов для этого является использование класса 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 Query Language) и в значительной степени основан на SQL.

Надеюсь, вы сможете довольно легко адаптировать вышеперечисленное для собственного использования. Просто будьте осторожны с фактическим типом полей, которые вы выбираете. Вот список свойств для объектов Win32_Service.

...