public void Start()
{
if (Running)
return;
_manualStop = false;
Running = true;
var info = new ProcessStartInfo(FileName);
info.Arguments = Args;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.StandardErrorEncoding = Encoding.UTF8;
info.StandardOutputEncoding = Encoding.UTF8;
info.UseShellExecute = false;
info.CreateNoWindow = true;
if (string.IsNullOrEmpty(WorkDir))
{
info.WorkingDirectory = Path.GetDirectoryName(FileName);
}
else
{
info.WorkingDirectory = WorkDir;
}
ThreadPool.QueueUserWorkItem(delegate(object state)
{
SafeCall( delegate {
if (OnStart != null)
{
OnStart(this);
}
});
Process p = null;
try
{
p = Process.Start(info);
_process = p;
}
catch (Exception e)
{
SafeCall( delegate {
OnError( this, Color.Red, e.ToString() );
});
}
if (p != null)
{
p.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
if (e.Data == null)
return;
var c = ColorSettings.PickColorFromText(e.Data);
SafeCall( delegate {
WriteLog(c, e.Data);
});
};
p.ErrorDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
if (e.Data == null)
return;
var c = ColorSettings.PickColorFromText(e.Data);
SafeCall( delegate {
WriteLog(c, e.Data);
});
};
p.BeginOutputReadLine();
p.BeginErrorReadLine();
Application.DoEvents();
p.WaitForExit();
ExitCode = p.ExitCode;
p.Close();
}
SafeCall(delegate
{
if (!_manualStop)
{
SelfExit = true;
}
if (OnExit != null)
{
OnExit(this );
}
});
_process = null;
Running = false;
});
}
// 命名规则: 与svc同目录下, svc.exe 对应的批处理是 svc_Build.bat void RunSvcShell(ProcessModel svcModel, bool startAfterDone) { if (!svcModel.Valid) { return; } // 还在跑的进程, 必须停下来 if (svcModel.Running) { svcModel.Stop(); } var buildcmd = Path.Combine(Path.GetDirectoryName(svcModel.FileName), Path.GetFileNameWithoutExtension(svcModel.FileName) + "_Build") + ".bat"; var shellModel = new ProcessModel(); shellModel.FileName = buildcmd; shellModel.invoker = this; shellModel.CanStop = false; shellModel.OnStart += (m) => { m.WriteLog(Color.Yellow, "启动Shell: " + buildcmd); }; Action <ProcessModel> stopProc = (m) => { m.WriteLog(Color.Yellow, "结束Shell: " + buildcmd); // 编译正常时, 启动进程 if (startAfterDone && shellModel.ExitCode == 0) { svcModel.Start(); } }; shellModel.OnStop += stopProc; shellModel.OnExit += stopProc; shellModel.OnLog += svcModel.OnLog; shellModel.OnError += svcModel.OnError; shellModel.Start(); RefreshButtonStatus(); }