none
Получение ответа от сервера RRS feed

  • Вопрос

  • Добрый день!

    Никак не могу найти, как получить в переменную ответ от сервера, на который посылаю команду с помощью такой штуки:

    System.Diagnostics.Process.Start("c:\Program Files (x86)\PuTTY\plink.exe", "-l <username> -pw
     <password> <hostname> cd /home/username/test/ ; /home/username/run")

    Если запустить через командную строку, в ответ приходит "Submitted batch job 21234". Такие строчки и должна запоминать программа

Ответы

  • Такой код либо читает первую попавшуюся строку (даже пустую), завершённую символом перевода строки, либо попадает в ситуацию взаимоблокировки. Попробуйте асинхронный вариант.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Norw._Salmon 9 мая 2014 г. 5:02

Все ответы

  • Используйте Process.StandardOutput. Только команду запуска придётся изменить, чтобы это свойство работало.
  • Процесс не возвращает строки, он может вернуть 32-разрядное целое. Если Вы имеете ввиду его вывод в консоль, то его можно перенаправить в поток и программно читать. Здесь описано, как это сделать.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

  • Используйте Process.StandardOutput. Только команду запуска придётся изменить, чтобы это свойство работало.

    Такой код получает нужный ответ, но почему-то не всегда.
            Dim myString As String
            Dim myProcess As New Process
            Dim myStreamReader As StreamReader
            Dim myProcessStartInfo As New ProcessStartInfo(plinkpath, myArguments)
            myProcessStartInfo.UseShellExecute = False
            myProcessStartInfo.RedirectStandardOutput = True
            'myProcessStartInfo.CreateNoWindow = True
            myProcess.StartInfo = myProcessStartInfo
            myProcess.Start()
            myStreamReader = myProcess.StandardOutput
            myString = myStreamReader.ReadLine
            myProcess.WaitForExit()
            myProcess.Close()
  • Такой код либо читает первую попавшуюся строку (даже пустую), завершённую символом перевода строки, либо попадает в ситуацию взаимоблокировки. Попробуйте асинхронный вариант.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Norw._Salmon 9 мая 2014 г. 5:02
  • Такой код либо читает первую попавшуюся строку (даже пустую), завершённую символом перевода строки, либо попадает в ситуацию взаимоблокировки. Попробуйте асинхронный вариант.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    На сколько я понял из статьи и того, что нагуглил, для асинхронного чтения нужно сваять что-то такое:

        Private Shared sortOutput As Text.StringBuilder = Nothing
    
        Public Shared Sub test()
    
            Dim myProcess As New Process
            Dim myProcessStartInfo As New ProcessStartInfo(plinkpath, myArguments)
            myProcessStartInfo.UseShellExecute = False
            myProcessStartInfo.RedirectStandardOutput = True
            myProcessStartInfo.CreateNoWindow = True
    
            AddHandler myProcess.OutputDataReceived, AddressOf OutputHandler
            myProcess.StartInfo = myProcessStartInfo
            myProcess.Start()
            myProcess.BeginOutputReadLine()
            myProcess.WaitForExit()
            myProcess.Close()
        End Sub
    
        Private Shared Sub OutputHandler(ByVal sendingProcess As Object, _
             ByVal outLine As System.Diagnostics.DataReceivedEventArgs)
    
            If Not String.IsNullOrEmpty(outLine.Data) Then
                sortOutput.Append(Environment.NewLine & outLine.Data)
            End If
        End Sub

    Но, видимо, я что-то не так делаю, ибо в саб OutputHandler аргуметом outLine.Data стабильно приходит Nothing
  • Не знаю, что за процессы Вы запускаете. У меня вот такой код работает. Он на C#, думаю, перевести сможете :)

    class Program
    {
    	static void Main(string[] args)
    	{
    		Process proc = new Process();
    		proc.OutputDataReceived += proc_OutputDataReceived;
    			
    		ProcessStartInfo si = new ProcessStartInfo("cmd.exe");
    		si.UseShellExecute = false;
    		si.RedirectStandardOutput = true;
    		proc.StartInfo = si;
    
    		bool res = proc.Start();
    		Debug.Assert(res);
    
    		proc.BeginOutputReadLine();
    		proc.WaitForExit();
    		proc.Close();
    	}
    
    	static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
    	{
    		Console.WriteLine(e.Data);
    	}
    }
    


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

  • Не знаю, что за процессы Вы запускаете. У меня вот такой код работает. Он на C#, думаю, перевести сможете :)

    Принципиально код такой же) То, что я написал, при запуске cmd тоже получало текст. 

    Решение нашлось методом тыка) Нужно было добавить:

    myProcessStartInfo.RedirectStandardInput = True

    Спасибо за помощь =)