2015-05-01 5 views
1

В настоящее время я пишу приложение, которое требует от пользователя стороннего генератора ключей шифрования. Инструмент представляет собой пакетный файл, который, в свою очередь, запускает исполняемый файл Java. Пакетный файл принимает несколько параметров, я в настоящее время с помощью -eC# Запуск пакетного файла и захват ответа

Вот мой текущий код метода:

private string EncryptedPassword(string unencrypted) 
     { 
      var process = new Process(); 
      process.StartInfo.FileName = "C:\\Users\\User\\Desktop\\encrypt2.bat"; 
      process.StartInfo.RedirectStandardOutput = true; 
      process.StartInfo.UseShellExecute = false; 
      process.StartInfo.Arguments = " –e " + unencrypted; 
      string returned = null; 
      process.OutputDataReceived += (sender, args) => returned = args.Data; 
      process.Start(); 
      process.BeginOutputReadLine(); 
      process.WaitForExit(); 
      return returned; 
     } 

Проблемы я получаю это:

'process.BasePriority' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException} 

Любые идеи, что я делаю неправильно? Я думаю, что это может быть ошибка разрешения файловой системы, и в этом случае это может быть разрешено с помощью параметра процесса?

+1

Какая линия выдает эту ошибку? –

+2

командный файл не является процессом. добавить «cmd.exe/c» + путь к файлу –

+0

@PraveenPaulose - process.Start(); выдает исключение –

ответ

1

Здесь вы идете с полным образцом. Обратите внимание: приоритет можно установить только после запуска процесса. Я рекомендую отметить детали, такие как установка кодировки UTF-8 дочернего процесса. Обратите внимание, что в этом примере я предполагаю, что вы действительно хотите, чтобы ждать, пока процесс не завершится, если это не так, то ваше обращение должно выглядеть немного иначе, но это уже другой вопрос ...

public class ProcessContainer 
{ 
    private Process process; 
    private List<string> processOutput = new List<string>(); 

    public List<string> RunProcessGrabOutput(string Executable, string Arguments) 
    { 
    try 
    { 
     process = new Process(); 
     process.StartInfo.FileName = Executable; 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.WorkingDirectory = Path.GetDirectoryName(Executable); 
     process.StartInfo.RedirectStandardInput = true; 
     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 
     process.StartInfo.StandardErrorEncoding = Encoding.UTF8; 
     process.StartInfo.StandardOutputEncoding = Encoding.UTF8; 

     if (!string.IsNullOrEmpty(Arguments)) 
     process.StartInfo.Arguments = Arguments; 

     process.EnableRaisingEvents = true; 
     process.OutputDataReceived += new DataReceivedEventHandler(ProcessOutputHandler); 
     process.ErrorDataReceived += new DataReceivedEventHandler(ProcessOutputHandler); 
     process.Start(); 

     process.BeginOutputReadLine(); 
     process.BeginErrorReadLine(); 

     // You can set the priority only AFTER the you started the process. 
     process.PriorityClass = ProcessPriorityClass.BelowNormal; 
     process.WaitForExit(); 
    } 
    catch 
    { 
     // This is how we indicate that something went wrong. 
     processOutput = null; 
    } 

    return processOutput; 
    } 

    private void ProcessOutputHandler(object SendingProcess, DataReceivedEventArgs OutLine) 
    { 
    processOutput.Add(OutLine.Data + Environment.NewLine); 
    } 
} 

Затем этот код :

private static void Main(string[] args) 
{ 
    ProcessContainer proc = new ProcessContainer(); 
    List<string> output = proc.RunProcessGrabOutput("ping.exe", "-n 5 8.8.8.8"); 
    if (output != null) 
    { 
    Console.WriteLine("Program's output:"); 
    foreach (string line in output) 
     Console.Write(">> " + line); 
    } 
    else Console.WriteLine("Unable to start program."); 
} 

Производит вывод так:

Program's output: 
>> 
>> Pinging 8.8.8.8 with 32 bytes of data: 
>> Reply from 8.8.8.8: bytes=32 time=23ms TTL=54 
>> Reply from 8.8.8.8: bytes=32 time=24ms TTL=54 
>> Reply from 8.8.8.8: bytes=32 time=24ms TTL=54 
>> Reply from 8.8.8.8: bytes=32 time=24ms TTL=54 
>> Reply from 8.8.8.8: bytes=32 time=24ms TTL=54 
>> 
>> Ping statistics for 8.8.8.8: 
>>  Packets: Sent = 5, Received = 5, Lost = 0 (0% loss), 
>> Approximate round trip times in milli-seconds: 
>>  Minimum = 23ms, Maximum = 24ms, Average = 23ms 
>> 
>> 
+0

Этот код работает отлично! Именно то, что я хотел после изменения формата вывода. Большое спасибо! –

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