Спасибочки всем!!! Подождать я не додумалась, решила, что результат туда сразу сливается по ходу выполнения команды. "И жить торопится", и начальство наседает
Дим, с cmd.OutputDataReceived я сначала делала, но поняла, что в моей ситуации это неудобно, т.к. нужна static - переменная для сохранения текста. Начала искать пути для менее обременительного получения и хранения данных. И тут был облом... Спасибочки за инфу!
кстати, а почему ты говоришь, что при UseShellExecute = false не должно быть самого окна? Оно прекрасно существует, только техт в окне отсутствует. Чтобы не появлялось окно, надо устанавливать cmd1.StartInfo.CreateNoWindow = true.
Джон,
спасибочки за подсказку насчет StandardError!
Кстати, определила, что:
1) cmd.StandardError.ReadToEnd() работает как в асинхронном, так и в синхронном режиме, а вот cmd.StandardOutput.ReadToEnd() - только в
синхронном.
2) cmd.BeginOutputReadLine() запускает асинхронный режим, после чего вызов cmd.StandardOutput.ReadToEnd() становится невозможным.
В результате вот (кусок из программки для всяких проб):
т.е. вызов команды для cleartool всегда будет давать ошибку.
ну а вызов dir обычно должен работать
private void btn_cmd_Click(object sender, EventArgs e)
{
string sArgs = " /c cleartool co -c \"test\" D:\\irina\\prog\\Exercises_c#\\UpdateStatusFiles\\Tebelewa_Test_Status_OMSp_CPPUNIT_EXE_GroupingOfVar_MPC.txt";
string outputErr = "";
TestCmd_asynchExecute(ref outputErr, sArgs);
sArgs = " /c dir";
string outputResult = "";
TestCmd_synchExecute(ref outputErr, ref outputResult, sArgs);
}
/// <summary>
/// start cmd - window and read output in asynchronous mode
/// </summary>
/// <param name="outputErr">out: error string</param>
/// <param name="sArgs">in: argument - string</param>
public void TestCmd_asynchExecute(ref string outputErr,
string sArgs)
{
System.Diagnostics.Process cmd1 = new System.Diagnostics.Process();
cmd1.StartInfo.Arguments = sArgs;
cmd1.StartInfo.FileName = "cmd.exe";
cmd1.StartInfo.RedirectStandardOutput = true;
cmd1.StartInfo.RedirectStandardError = true;
cmd1.StartInfo.UseShellExecute = false;
cmd1.Start();
cmd1.BeginOutputReadLine();
outputErr = cmd1.StandardError.ReadToEnd();
cmd1.WaitForExit();
if (cmd1.ExitCode != 0)
{
outputErr += " *** return code = " + Convert.ToString(cmd1.ExitCode);
}
}
/// <summary>
/// start cmd - window and read output in synchronous mode
/// </summary>
/// <param name="outputErr">out: error string</param>
/// <param name="outputResult">out: output string</param>
/// <param name="sArgs">in: argument - string</param>
public void TestCmd_synchExecute(ref string outputErr,
ref string outputResult,
string sArgs)
{
System.Diagnostics.Process cmd1 = new System.Diagnostics.Process();
cmd1.StartInfo.Arguments = sArgs;
cmd1.StartInfo.FileName = "cmd.exe";
cmd1.StartInfo.RedirectStandardOutput = true;
cmd1.StartInfo.RedirectStandardError = true;
cmd1.StartInfo.UseShellExecute = false;
cmd1.Start();
outputErr = cmd1.StandardError.ReadToEnd();
outputResult = cmd1.StandardOutput.ReadToEnd();
cmd1.WaitForExit();
if (cmd1.ExitCode != 0)
{
outputErr += " *** return code = " + Convert.ToString(cmd1.ExitCode);
}
}