Отправка команд на стандартный ввод и отправка конца передачи (Ctrl + D)

Я хочу запустить следующий код.

Приложение, которое я вызываю, ожидает таких команд, как User-Name = albert, следующая строка, другая команда и так далее, пока вы не закончите.

Если бы вы вводили это вручную из командной строки, вы бы набрали команду, нажмите клавишу ВВОД, введите команду, нажмите клавишу ВВОД. В самом конце ПОСЛЕ НАЖАТИЯ ВВОДА после последней команды вы должны нажать Ctrl + D, чтобы завершить ее, которая запустит программу и вернется с сообщением о том, что произошло.

Если вы введете команду неправильно, приложение скажет "expecting =", что означает, что вы отправили строку, которая отформатирована неправильно ...

Итак, то, что я делаю ниже, - это моделирование ввода этого вручную, одной команды, новой строки, одной команды, новой строки и т. Д. До конца, а затем я просто добавляю Ctrl + D после последней команды. Это не работает, и программа говорит: «Ожидается =».

Есть очевидные проблемы?

Спасибо за ваше время. Альберт

        // CREATE DISCONNECT FILE
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("User-Name=" + this.userName);
        sb.AppendLine("Acct-Session-Id=" + this.sessionID);
        sb.AppendLine("NAS-IP-Address=" + Setting.Item["EDGE.NASIP"]);
        sb.AppendLine("Framed-IP-Address=" + this.currentIP);
        sb.Append("/x4");
        System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo();
        procStartInfo.WorkingDirectory = radclientPath.Substring(0, radclientPath.LastIndexOf("\\"));
        procStartInfo.FileName = radclientPath;
        procStartInfo.Arguments = @"-r 1 -d ..\etc\raddb -x 192.168.1.240:3799 disconnect password";
        procStartInfo.RedirectStandardInput = true;
        procStartInfo.RedirectStandardError = true;
        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;

        System.Diagnostics.Process proc = System.Diagnostics.Process.Start(procStartInfo);

        proc.StandardInput.Write(sb.ToString());
        proc.WaitForExit(5000);

        if (proc.HasExited)
        {
            System.IO.File.WriteAllText(@"D:\temp.txt", proc.StandardOutput.ReadToEnd());
            System.IO.File.WriteAllText(@"D:\temp2.txt", proc.StandardError.ReadToEnd());
            string message = proc.StandardOutput.ReadToEnd() + "\n---\nErrors:\n---\n" + proc.StandardError.ReadToEnd();
            return message;
        }
        System.IO.File.WriteAllText(@"D:\temp.txt", proc.StandardOutput.ReadToEnd());
        System.IO.File.WriteAllText(@"D:\temp2.txt", proc.StandardError.ReadToEnd());
        return "";
    }

Я также пробовал использовать его в одинарных кавычках и с нулем в начале числа (\ x04) и ничего, поэтому я попытался записать то, что должно быть отправлено в программу, в текстовый файл. Затем я запустил программу, используя те же параметры командной строки, что и ниже. Скопировал то, что было во всем текстовом файле, и вставил его в командную строку, и это отлично работает. Не уверен, почему он неправильно отправляется на стандартный ввод ..

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("User-Name=" + this.userName);
        sb.Append('\x04');
        System.IO.File.WriteAllText(@"D:\input.txt", sb.ToString());
        System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo();
        procStartInfo.WorkingDirectory = radclientPath.Substring(0, radclientPath.LastIndexOf("\\"));
        procStartInfo.FileName = radclientPath;
        procStartInfo.Arguments = @"-r 1 -d ..\etc\raddb -x 192.168.1.240:3799 disconnect password";
        procStartInfo.RedirectStandardInput = true;
        procStartInfo.RedirectStandardError = true;
        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;
        System.Diagnostics.Process proc = System.Diagnostics.Process.Start(procStartInfo);
        proc.StandardInput.Write(sb.ToString());
        proc.WaitForExit(5000);

person Albert    schedule 03.03.2010    source источник


Ответы (2)


Вам нужно написать добавление "\x04" с обратной косой чертой (\)

Для получения дополнительной информации см. документацию (раздел «Последовательности экранирования строк»)

person SLaks    schedule 03.03.2010

sb.Append("/x4");

это не контроль-D

Возможно, вы имели в виду

sb.Append("\x04");
person Blair Conrad    schedule 03.03.2010
comment
В моем исходном коде был \ x4, извините, это была опечатка, которую я допустил при создании сообщения. Я попробую добавить 0 перед 4 и доложить! спасибо, Альберт - person Albert; 04.03.2010