proc.StandardOutput.ReadLine () возвращает пустую строку, когда я собираюсь запустить команду p4 (Perforce) из моего кода на c # - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть рабочий код на C # (конечно, на другой машине), которого после миграции больше нет. Код запускает команду к серверу Perforce в командной строке и читает выходные данные в поисках определенной строки. код:

string result="";
            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe");
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardInput = true;
            psi.RedirectStandardError = true;

            //Start the process
            System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);
            //Attach output for reading
            System.IO.StreamReader sOut = proc.StandardOutput;
            System.IO.StreamWriter sIn = proc.StandardInput;

            sIn.WriteLine(@"p4 changelists -m 1 -s submitted //<SOME_PATH_HERE>");
            proc.WaitForExit(500);
            sIn.WriteLine("EXIT");

            while((result=sOut.ReadLine()) != null)
            {
                if(result != "")
                {
                    if(result.Substring(0, 6) == "Change")
                    {
                        //get Changelist number
                        result = result.Substring(7, 6);
                        break;
                    }
                }
            }
            if((result == "") || (result == null))  //if perforce goes down
            {

проблема в том, что когда я выполняю некоторые хорошо известные команды cmd.exe, такие как DIR и ... Я могу видеть вывод строки за строкой в ​​моей переменной результата, но для этой специальной командыиз p4 строка результата пуста.

Я погуглил мою проблему, и ближайшая вещь, которая могла быть связана, была связана с CASPOL!?

Я не имею ни малейшего представления о том, что это такое, и как я могу от него избавиться.

любая помощь будет оценена.

1 Ответ

1 голос
/ 08 ноября 2019

Я недостаточно знаком с C #, чтобы иметь возможность отлаживать часть RedirectStandardError вашего кода, но обычно , если вы пишете команду p4, и она молча терпит неудачу, это означает, что вывы не захватываете stderr.

Я вижу, как ваш код явно захватывает стандартный вывод;может, нужно что-то подобное сделать?

System.IO.StreamReader sErr = proc.StandardError;
...
while((result=sErr.ReadLine()) != null)
   ...

Я заметил, что ваш код не предоставляет никакой информации о соединении, поэтому я думаю, почему после миграции происходит сбой, так как он зависел от аутентификации /параметры подключения в среде старого компьютера (например, допустимые значения для P4USER и P4PORT и файл P4TICKETS с действительным билетом проверки подлинности). Если вам удастся получить stderr из-за неудачной команды, она даст вам больше информации (например, «не удается подключиться к серверу» или «ошибка аутентификации» или «пользователь неизвестен»).

...