2016-05-26 124 views
0

我正在通过命令行运行一个exe文件并获得跟随输出。如何读取进程输出进程中的进程消息?

C:\ Users \用户系统管理员> C:\ Users \用户系统管理员\桌面\ New_folder \设置\ PatchInstaller.exe --mode =无声

C:\ Users \用户系统管理员开始设置UI模式:无提示错误: 正在运行另一个实例,一次只能运行一个实例。 退出代码:11

我公司通过System.daignostics.process运行此。

我的问题是PatchInstaller.exe调用另一个进程,并且该嵌套进程的输出是使用cmd可见的。但相同的结果和退出代码,我无法通过PatchInstaller.exe的进程对象。 有没有什么办法可以让程序在进程内运行? 以下是代码,我累了...

  string command = @"C:\Users\sysadmin\Desktop\Setup\PatchInstaller.exe"; 
      string result = string.Empty; 
      System.Diagnostics.ProcessStartInfo procStartInfo = new ProcessStartInfo(); 
      procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command + " --mode=silent); 
      System.Diagnostics.Process proc = new Process(); 
      procStartInfo.ErrorDialog = false; 
      procStartInfo.UseShellExecute = false; 
      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.RedirectStandardError = true; 
      procStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      // Do not create the black window. 
      procStartInfo.CreateNoWindow = true; 

      if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(pwd)) 
      { 
       procStartInfo.Domain = domain; 
       procStartInfo.UserName = user; 

       System.Security.SecureString ss = new System.Security.SecureString(); 
       foreach (char c in pwd) { ss.AppendChar(c); } 
       procStartInfo.Password = ss; 
      } 

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

      proc.ErrorDataReceived += delegate(object sender, System.Diagnostics.DataReceivedEventArgs errorLine) 
      { 
       if (errorLine.Data != null) result += "error:" + errorLine.Data +; 

      }; 
      proc.OutputDataReceived += delegate(object sender, System.Diagnostics.DataReceivedEventArgs outputLine) 
      { 
       if (outputLine.Data != null) result += outputLine.Data +; 

      }; 
      proc.BeginErrorReadLine(); 
      proc.BeginOutputReadLine(); 
      Process[] pname = Process.GetProcessesByName("PatchInstaller"); 
      Process[] processlist = Process.GetProcesses(); 
      foreach (Process theprocess in processlist) 
      { 
       Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id); 
      } 

      proc.WaitForExit(); 

回答

0

我不知道很多关于ProcessStartInfo但我用Process前后办法脱身标准输出的信息,如下所示,我假设仅仅通过访问StandardOutput

Process cmd = new Process(); 

cmd.StartInfo.FileName = "cmd.exe"; 
cmd.StartInfo.RedirectStandardInput = true; 
cmd.StartInfo.RedirectStandardOutput = true; 
cmd.StartInfo.CreateNoWindow = false; 
cmd.StartInfo.UseShellExecute = false; 
cmd.Start(); 

cmd.StandardInput.WriteLine(command); 
cmd.StandardInput.Flush(); 
cmd.StandardInput.Close(); 

var output = cmd.StandardOutput.ReadToEnd(); 

cmd.WaitForExit(); 
0

此代码工作对我来说应该是类似的方式:

const int MAX_EXIT_WAIT_TIME = 3000; 
    // Fill needed data 
    string username = ""; 
    string password = ""; 
    string domain = ""; 
    string appName = ""; 

    var dir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); 
    var appFullPath = Path.Combine(dir, appName); 
    ProcessStartInfo psi = new ProcessStartInfo(appFullPath); 
    psi.UserName = username; 
    var securePass = new System.Security.SecureString(); 
    foreach (var c in password) 
     securePass.AppendChar(c); 
    psi.Password = securePass; 
    psi.Domain = domain; 
    psi.LoadUserProfile = false; 
    psi.WorkingDirectory = dir; 
    psi.Arguments = ""; 
    psi.RedirectStandardOutput = true; 
    // Create Process object, but not start it! 
    var proc = new Process(); 
    proc.StartInfo = psi; 
    StringCollection values = new StringCollection(); 
    DataReceivedEventHandler outputDataReceived = (o, e) => 
    { 
     lock (values) 
      values.Add(e.Data); 
    }; 
    try 
    { 
     proc.OutputDataReceived += outputDataReceived; 
     // Only here we start process 
     if (!proc.Start()) 
      throw new InvalidOperationException("Couldn't start app"); 
     proc.BeginOutputReadLine(); 
     proc.WaitForExit(MAX_EXIT_WAIT_TIME); 
    } 
    finally { proc.OutputDataReceived -= outputDataReceived; } 
    Console.WriteLine("Read {0} ", values.Count); 
    foreach (var item in values) 
     Console.WriteLine(" {0}", item); 
+0

PatchInstaller.ex e它将静默执行,然后它将调用PatchInstaller.exe中的其他进程,并且将获得C:\ Users \ sysadmin>开始设置 UI模式:无提示 错误:正在运行的进程冲突。 退出代码:19所以我需要阅读这一行。我在这里被卡住了。 –

+0

我不明白你说的是什么。 –

+0

感谢您的回复。但我不是在寻找你在这里完成的一样。当exe直接执行并在命令行下面给出输出时,这是一个可用的代码。 这里我的exe文件正在运行,它将首先执行下面的行, C:\ Users \ sysadmin \ Desktop \ New_folder \ Setup \ PatchInstaller.exe --mode = silent 现在PatchInstaller.exe在内部执行其他进程,我是(EX:C:\ Users \ New_folder \ Setup \ PatchInstaller.exe --mode = silent(回车)C:\ Windows \ system32>开始安装程序退出代码:19;(需要读取这条线。) –