c# - 如何将标准输出从Windows窗体应用程序中的C#中的psexec进程重定向到文件

原文 标签 c# winforms psexec redirectstandardoutput

我一直在尝试从psexec作为C#Windows Forms应用程序中的一个进程运行来获取控制台输出。我发现我可以将标准输出(和标准错误)重定向到控制台应用程序中可以正常运行的指定文本文件,并且可以在所使用的进程不是PsExec(例如ping)时重定向输出,但是当我尝试在Windows窗体应用程序中使用psexec,通常我的日志中会出现一个空行,或者充其量我已经能够获得第一行。我知道psexec在同步重定向输出中遇到了问题,但是即使在Windows窗体应用程序中使用时,也存在异步问题。

我的代码称为运行该过程的方法:

class Tester
    {

        static readonly StringBuilder outputText = new StringBuilder();
        static readonly StringBuilder errorText = new StringBuilder();

        public void Installer(string command, string arguments)
        {
            using (var psexec = Process.Start(new ProcessStartInfo(
               command,
                arguments)
            {
                CreateNoWindow = true,
                ErrorDialog = false,
                RedirectStandardError = true,
                RedirectStandardOutput = true,
                UseShellExecute = false
            }))
            {

                psexec.OutputDataReceived += (sendingProcess, outLine) =>
                    outputText.AppendLine(outLine.Data);

                psexec.ErrorDataReceived += (sendingProcess, errorLine) =>
                    errorText.AppendLine(errorLine.Data);

                psexec.BeginOutputReadLine();
                psexec.BeginErrorReadLine();

                psexec.WaitForExit();

                string text = outputText.ToString();
                File.AppendAllText(@"C:\test\psexec-test.log", text);

            }

        }
    }


当在这样的控制台应用程序中调用时,上述方法有效(将我期望的psexec输出提供给我一个指定的文件):

class Program
{
    static void Main(string[] args)
    {
        Tester test1 = new Tester();

        test1.Installer("PsExec.exe", @"-h \\remoteserver ipconfig");
    }
}


但是,如果我从类似的Windows窗体应用程序中调用它,如下所示:

public partial class Form1 : Form
{

    Tester test = new Tester();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string sendAddress = Address.Text;
        test.Installer("psexec.exe", @"-h \\remoteserver ipconfig");
    } }


我只会得到:


  Windows IP配置
  
  做完了!
  没有来自ipconfig的其余结果。


在较大的应用程序中,我使其他所有工作都可以正常工作,并且我知道实际工作已经完成(它在远程计算机或多台远程计算机上运行安装程序),但是我没有从psexec获得输出。 Windows窗体应用程序缺少我什么东西,以及如何使重定向与psexec一起使用?

最佳答案

好像您是在开始该过程中大步向前。让您惊讶的是,您在控制台应用程序中获得了想要的东西。但是我认为您想创建自己的流程,钩住事件,然后开始:

public void Installer( string command, string arguments, string logFile )
{
  var outputText = new StringBuilder( );
  var errorText = new StringBuilder( );

  var startInfo = new ProcessStartInfo( command, arguments )
  {
    CreateNoWindow = true,
    ErrorDialog = false,
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false
  };

  using ( var psexec = new Process( ) )
  {
    psexec.StartInfo = startInfo;
    psexec.OutputDataReceived += ( _, dat ) => outputText.AppendLine( dat.Data );
    psexec.ErrorDataReceived += ( _, dat ) => errorText.AppendLine( dat.Data );
    psexec.Start( );
    psexec.BeginOutputReadLine( );
    psexec.BeginErrorReadLine( );
    psexec.WaitForExit( );

    File.AppendAllText( logFile, outputText.ToString( ) );
  }
}

相关文章:

c# - 无法为WCF服务传递与C#格式相同的Java参数

c# - 尝试使用psexec(C#)在远程上运行.exe时出现问题?

c# - 调用System.Console.WindowWidth时发生System.IO.IOException

c# - 如何从Windows 7客户端计算机重新启动远程Windows服务器上的IIS?

c# - 如果属性类型不固定,如何反序列化json-可以为空字符串或对象,请提出建议。如何处理这种情况?

c# - 如何确定对象的类型是否为任何值类型T的IEnumerable <T>的子类?

c# - C#中的Powershell语句

c# - C#Windows窗体本地化测试

c# - 在pictureBox中加载Pgm图像

c# - 为什么Application.DoEvents使CPU使用率提高到100%