【问题标题】:How to read process Output Message from process within the process?如何从进程内的进程中读取进程输出消息?
【发布时间】:2016-05-26 09:54:47
【问题描述】:

我正在通过命令行运行 exe 并获得以下输出。

C:\Users\sysadmin>C:\Users\sysadmin\Desktop\New_folder\Setup\PatchInstaller.exe --mode=silent

C:\Users\sysadmin 开始设置 UI 模式:静默错误: 另一个实例正在运行,一次只能运行一个实例。 退出代码:11

我通过 System.daignostics.process 运行它。

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

            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();

【问题讨论】:

    标签: c# asp.net process console-application


    【解决方案1】:

    我对@9​​87654321@了解不多,但我之前使用过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();
    

    【讨论】:

      【解决方案2】:

      这段代码对我有用:

          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);
      

      【讨论】:

      • PatchInstaller.exe 它将静默执行,然后它将调用 PatchInstaller.exe 内的其他进程并获得 C:\Users\sysadmin>开始设置 UI 模式:静默错误:冲突进程正在运行。退出代码:19 所以我需要阅读这段代码。我在这里卡住了。
      • 我没听懂你在说什么。
      • 感谢您的重播。但我不是在寻找你在这里所做的那样。当 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 (Enter) C:\Windows\system32>Begin Setup Exit Code:19;(需要阅读这一行。)
      • 您是否要重定向输出而不是创建的进程,但它是子进程?如果是的话,我认为没有一些黑客是不可能的。
      猜你喜欢
      • 2012-10-28
      • 2013-01-25
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多