2015-06-16 3 views
4

Я пытаюсь скопировать выходные данные из программы, заканчивающейся приглашением CMD, в буфер обмена Windows.Копирование вывода CMD в буфер обмена

 private void button1_Click(object sender, EventArgs e) 
      { 
      /*Relevant Code*/ 
      Process p = new Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.RedirectStandardOutput = true; 
      p.StartInfo.FileName = "cmd.exe"; 
      p.StartInfo.Arguments = String.Format("/k cd {0} && backdoor -rt -on -s{1} -p{2}", backdoorDir, pSN, sPPC); 
      p.Start(); 

      p.WaitForExit(); 
      string result = p.StandardOutput.ReadToEnd(); 
      System.Windows.Forms.Clipboard.SetText(result); 
      } 

Если бы я был ввести это прямо в CMD, это будет выглядеть следующим образом:

Первой команда (изменить каталог):

cd C:\users\chris\appdata\roaming\backdoor 

Второй команда (запускает бэкдор, инструмент CMD . Аргументы следуют).

backdoor -rt -on -sCCDXE -p14453 

И, делая это через CMD, я получаю этот результат:

The backdoor password is: 34765 

C:\users\chris\appdata\roaming\backdoor> 

Однако, при запуске мой C# код, это единственное, что будет добавлен в мой буфер обмена:

C:\users\chris\appdata\roaming\backdoor> 

Почему это не захватывая «бэкдор пароль: 34765» Это как p.StandardOutput.ReadToEnd() не читает все.

+1

Try используя 'p.StartInfo.RedirectStandardError = true' и' p.StandardError.ReadToEnd() 'вместо – Icemanind

+0

Это сделало это ... Спасибо. –

ответ

2

Вызов ReadToEnd перед тем WaitForExit

код Криса:

private void button1_Click(object sender, EventArgs e) 
    { 
     /*Relevant Code*/ 
     Process p = new Process(); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.FileName = "cmd.exe"; 
     p.StartInfo.Arguments = String.Format("/k cd {0} && backdoor -rt -on -s{1} -p{2}", backdoorDir, pSN, sPPC); 
     p.Start(); 

     string result = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 
     System.Windows.Forms.Clipboard.SetText(result); 
    } 

Пример кода консольного приложения:

 Process p = new Process(); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.FileName = "cmd.exe"; 
     p.StartInfo.Arguments = "/C dir"; 
     p.Start(); 

     string result = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
  • аргумент /C выполняет команду, а затем завершает процесс CMD. Это необходимо для работы этого кода. В противном случае он будет ждать навсегда.
+0

Спасибо за быстрый ответ. Я внес изменения, которые вы предложили, поставив «wait» после «read». Когда я нажимаю кнопку для выполнения в моей программе, я получаю окно CMD, которое появляется со следующим: 'Пароль бэкдора: 34765'. Но он записывает 'C: \ users \ chris \ appdata \ roaming \ backdoor>' в мой буфер обмена все еще, а также Console.WriteLine(), который я добавил, чтобы исключить любые возможные проблемы с буфером обмена. –

+1

Все это правильно. Мне просто нужно было использовать RedirectStandardError. Благодаря! –

+0

Хорошая находка! Я обновил ответ –

2

Один Резон может быть, что программа не фактически писать в StdOut, но на экран непосредственно.

Испытание это, перенаправив вывод в файл:

backdoor -rt -on -sCCDXE -p14453 > c:\text.txt 

Если новый файл не содержит вывод либо, то вы застряли, и, возможно, придется смотреть на экран выскабливание ..

Смежные вопросы