2015-06-03 3 views
0

Существует всегда способ чтения CMD вывода с помощью C# консольное приложение, как то, что говорилось и прошу добавить к этой теме: How to parse command line output from c#?CMD Чтение C# консольного приложения

Однако то, что мне нужно, это наоборот бывшего вопрос , Я хочу создать консольное приложение (будь то на C# или в Vb - не имеет значения), которое вернет выход, который можно прочитать внешней программой, например cmd.exe.

Я хотел бы сделать так же просто, как:

class Program 
{ 
    static DataTable Main(string[] args) 
    { 
     // do some stuff 
     return myDataTable; //(or String) 
    } 
} 

, но не повезло.

+1

'Console.Write' /' Console.WriteLine' и другие методы 'Console' позволяют выводить на консоль, но это очень запутывает то, что вы хотите, поскольку cmd.exe - это командная строка, поэтому она не читает" что-нибудь. –

+0

'main()' не может возвращать сложные объекты, такие как 'DataTable' (он может возвращать' void' или 'int', я считаю). Если вам нужен вывод сложного объекта, который читается другой программой, посмотрите на сериализацию. – Tim

+0

Сохранить как XML. Очень просто. Вам нужно добавить DataTable в Dataset. Затем: DataSet ds = new DataSet(); DataTable dt = new DataTable(); ds.Tables.Add (dt); ds.WriteXml ("filename", XmlWriteMode.WriteSchema); ds.ReadXml ("filename"); – jdweng

ответ

1

Как видно, состояние чтения содержимого окна консоли очень сбивает с толку. Почему бы вам не перенаправить вывод консоли в файл (а также консоль, если хотите), а затем решение станет тривиальным.

This article описывает, как вы можете использовать свой собственный трассировщик/консольный прослушиватель/регистратор, расширяя TextWriter и настраивая поток Console.Out.

+0

Да, перенаправление вывода консоли csharp_console.exe в файл xml или json было моим последним средством. Я надеюсь, что если я смогу что-то сделать, то: C: \\ begin sharp_console.exe 'someparamter'' возвращает выходное сообщение в моих окнах cmd.^_^ –

1

Вы рассматривали использование Windows PowerShell вместо Cmd.exe? PowerShell может работать с объектами .NET или COM, а не ограничиваться простым текстом, как в случае с Cmd.exe. Поэтому вам не нужно беспокоиться о выходе вообще - вы просто кодируете свои классы, а затем используете их непосредственно из PowerShell. Так, например, вы можете сделать это:

 
PS C:\WINDOWS\system32> $list = New-Object System.Collections.ArrayList 

PS C:\WINDOWS\system32> $list.Add("First item") 
0 

PS C:\WINDOWS\system32> $list.Add("Second item") 
1 

PS C:\WINDOWS\system32> $list 
First item 
Second item 

PS C:\WINDOWS\system32> $list.Count 
2 

PS C:\WINDOWS\system32>

Как вы можете видеть, легко создавать объекты и вызвать их методы и свойства с помощью PowerShell. Это одна из причин того, что PowerShell теперь является основным интерфейсом управления Microsoft. Возможность работать с объектами из интерфейса командной строки очень эффективна, и PowerShell стоит посмотреть.

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

В консольном приложении всегда есть в наличии три потока, известный как stdin, stdout и stderr («стандартный ввод», «стандартный вывод» и «стандартная ошибка»). stdout обычно подключается к дисплею, и stdin обычно подключается к входу клавиатуры, поэтому по умолчанию консольное приложение вводит с клавиатуры и записывает вывод на дисплей. Однако потоки могут быть перенаправлены в/из файла или непосредственно в другую программу.

> символ перенаправляет stdout в файл. Таким образом,

dir > myfiles.txt 

записывает вывод в файл myfile.txt вместо отображения.

Аналогичным образом, выход может быть «водопроводной» непосредственно к другой программе, например:

dir | more 

Труба (|) символ в середине соединяет stdout из команды dir непосредственно stdin команды more и поэтому данные передаются непосредственно между двумя программами. Обратите внимание, что dir все еще просто записывает на консоль, он не обязательно знает, что его выход был перенаправлен.

Используя один из вышеперечисленных методов, в сочетании с сериализацией вы можете организовать передачу данных между приложениями командной строки. Вам нужно будет упорядочить ваши данные для сериализации в формате, который обе программы могут понять, и облегчить жизнь с использованием формата, такого как XML или JSON, было бы разумным, поскольку его легче десериализовать, чем простой текст.

+0

Примечание: не совсем ясно, чего вы пытаетесь достичь. Я ответил, что я пытаюсь сделать, но если я неправильно понял, пожалуйста, уточните в комментарии или отредактируйте свой вопрос, и я обновлю свой ответ на совпадение. –

+0

да, это тоже помогло. но я больше сосредоточился на том, как читать вывод консоли C#. Что-то вроде: 'C: \\ Запустите csharp.exe 'todo' 'и отобразите выходное сообщение в моем окне cmd –

Смежные вопросы