За пускането на програма:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=VS.90).aspx
По-специално този код трябва да ти свърши работа:
Код:
using System;
using System.Diagnostics;
using System.ComponentModel;
namespace MyProcessSample
{
class MyProcess
{
public static void Main()
{
Process myProcess = new Process();
try
{
myProcess.StartInfo.UseShellExecute = false;
// You can start any process, HelloWorld is a do-nothing example.
myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();
// This code assumes the process you are starting will terminate itself.
// Given that is is started without a window so you cannot terminate it
// on the desktop, it must terminate itself or you can do it programmatically
// from this application using the Kill method.
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Ако не работи сложи myProcess.StartInfo.UseShellExecute = true; иначе предполагам, че няма да знае как да отвори .cmd но не съм сигурен. Пробвай и по двата начина.
Сега за четенето на файла. Предполагам, че .cmd файла ти го генерира. Така както си го замислил да чака 30 сек. и да го чете после е най-лошия вариант. Първо в тези 30 секунди може да са го отворили още хора и вече информацията е невалидна и стара, второ 30 секунди са много време ако .cmd скрипта ти се изпълни бързо и са малко ако по някаква причина не успее за това време (което ме съмнява).
Та най-добрия вариант е да си пипнеш малко скрипта и да го направиш да не пише във файл ами просто да показва информацията, която ти трябва. Така с .net можеш да я прочетеш на момента, без да се налага да ползваш файлове за връзката. Ето ти пример за четене на нещата от процеса за cmd файла:
1. слагаш това
myProcess.StartInfo.RedirectStandardOutput = true; горе там преди myProcess.Start();
2. След myProcess.Start():
Код:
string output = myProcess.StandardOutput.ReadToEnd();
myProcess.WaitForExit();
Първия ред прочита всичко върнато от процеса в стринга output, а втория ред казва на кода да спре и да изчака процеса да свърши преди да продължи надолу.
Така елиминирахме и нуждата от 30секундно чакане. Когато процеса спре, тогава ще продължи и скрипта ти.
Ако не можеш да промениш кода на .cmd файла тогава просто сложи myProcess.WaitForExit(); след старт-а и пак няма да се налага да чакаш фиксирано време, ами колкото му отнеме на процеса да свърши.
ПП. Тук има още инфо за четене от стандартния изход на процеси (това, което виждаш принтнато в конзолата) - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=VS.90).aspx