Помогите с .ReadToEnd() с командной строкой

Эй, я пытаюсь использовать программу командной строки PowerISO piso.

Я использую С#, чтобы открыть процесс и ввести команду для монтирования компакт-диска/DVD. Это работает нормально, и CD / DVD каждый раз монтируется.

Беда в том, что .ReadToEnd() не перестанет читать и программа на этом зависнет. Кажется, что ответ из командной строки должен быть

PowerISO Version 4.5 Copyright(C) 2004-2009 PowerISO Computing, Inc Type piso -? for help

Mount successfully

Однако я только получаю:

PowerISO Version 4.5 Copyright(C) 2004-2009 PowerISO Computing, Inc Type piso -? for help

и программа будет продолжать читать вечно, никогда не получая успешного вывода Mount.

Вот мой код С#:

String output = "";
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.WorkingDirectory = @"C:\";               //@"

cmd.StartInfo.FileName = Path.Combine(Environment.SystemDirectory, "cmd.exe");
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardError = false;
cmd.Start();

cmd.StandardInput.WriteLine(MountPrgLoc + " " + 
                                                MountPrgCmd_Mount + " " +
                                                location + " " +
                                                drive);
StreamReader sr = cmd.StandardOutput;
output = sr.ReadToEnd() ;
MessageBox.Show(output);

Заранее спасибо за любую помощь - Скотт

------------------Редактировать ------------------ Дополнительная информация:

/* DVD Attributes */
String name = "My Movie Title";
String location = "\"" + @"C:\Users\Razor\Videos\iso\Movie.iso" + "\"";
String drive= "H:";
String format = ".iso";

/* Special Attributes */
String PlayPrg = "Windows Media Center";
String PlayPrgLoc = @"%windir%\ehome\";       //@"
String MountPrg = "PowerISO";
String MountPrgLoc = "\"" + @"C:\Program Files (x86)\PowerISO\piso.exe" + "\"";    //@"
String MountPrgCmd_Mount = "mount";
String MountPrgCmd_Unmount = "unmount";

person Scott    schedule 25.09.2010    source источник


Ответы (1)


Почему вы хотите использовать cmd.exe? Команда piso.exe завершит работу, а cmd.exe — нет. ReadToEnd() будет продолжать ждать выхода программы cmd.exe и не вернется. Лучшим способом будет прямой вызов piso.exe для монтирования, что в вашем случае будет:

String output = "";
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.WorkingDirectory = @"C:\Program Files (x86)\PowerISO";

cmd.StartInfo.FileName = "piso.exe";
cmd.StartInfo.Arguments = MountPrgCmd_Mount + " " + location + " " + drive;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.Start();

StreamReader sr = cmd.StandardOutput;
output = sr.ReadToEnd();
cmd.WaitForExit();
MessageBox.Show(output);
person Yogesh    schedule 25.09.2010
comment
Спасибо за ответ, я использовал cmd.exe для запуска нескольких команд и проверки их правильного выполнения, я попытаюсь разбить его с помощью piso.exe и вернусь к вам :) - person Scott; 26.09.2010