Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向输出时PsExec挂起_C#_Psexec - Fatal编程技术网

C# 重定向输出时PsExec挂起

C# 重定向输出时PsExec挂起,c#,psexec,C#,Psexec,我在这里看到了类似的帖子,但似乎没有一个解决方案(对我有效)。因此,发布“另一个”,希望这一个将有助于确定什么是错的。这也是交叉张贴在 我一直在寻找这个问题的答案(似乎有相当多的人正在经历这个问题),但似乎没有找到一个可靠的解决方案。所以我想我会再次提出这个问题,因为这对我们来说是一个相当痛苦的问题 我正在尝试使用psexecv2.0在几个远程机器上启动进程(并行),等待这些进程完成,然后检查错误代码以确保所有进程都成功完成。它似乎在某些机器上运行良好,但并非所有机器都正常(在同事和客户环境中出

我在这里看到了类似的帖子,但似乎没有一个解决方案(对我有效)。因此,发布“另一个”,希望这一个将有助于确定什么是错的。这也是交叉张贴在

我一直在寻找这个问题的答案(似乎有相当多的人正在经历这个问题),但似乎没有找到一个可靠的解决方案。所以我想我会再次提出这个问题,因为这对我们来说是一个相当痛苦的问题

我正在尝试使用psexecv2.0在几个远程机器上启动进程(并行),等待这些进程完成,然后检查错误代码以确保所有进程都成功完成。它似乎在某些机器上运行良好,但并非所有机器都正常(在同事和客户环境中出现故障)。下面是如何使用它的代码片段:

        foreach (WorkerServer worker in configSection.WorkerServers)
        {
            Process workerProcess = new Process();
            workerProcess.StartInfo.FileName = PsExecLocation;
            workerProcess.StartInfo.Arguments = BuildPsExecArguments(worker);

            if (configSection.CaptureOutput)
            {
                workerProcess.StartInfo.UseShellExecute = false;
                workerProcess.StartInfo.RedirectStandardError = true;
                workerProcess.StartInfo.RedirectStandardOutput = true;

                workerProcess.OutputDataReceived += new DataReceivedEventHandler(workerProcess_OutputDataReceived);
                workerProcess.ErrorDataReceived += new DataReceivedEventHandler(workerProcess_ErrorDataReceived);
            }

            workerProcess.Start();

            if (configSection.CaptureOutput)
            {
                workerProcess.BeginOutputReadLine();
                workerProcess.BeginErrorReadLine();
            }

            workerProcesses.Add(workerProcess);
        }

        foreach (Process process in workerProcesses)
        {
            process.WaitForExit();
            ......
如果设置了上述“CaptureOutput”,并且代码通过设置捕获StdOut和StdErr,那么在某些机器上,我们观察到远程工作进程已退出,但PsExec仍在运行,并且没有返回退出代码

迄今为止尝试/观察到的事情:

  • 使用-i选项。当使用该选项时,它根本不起作用,我得到2250个错误。如果没有它,它将连接并启动流程
  • -d选项不是选项b/c我必须有远程进程的退出代码
  • -这没用
  • 不捕获输出可以使其工作(但这是一个问题,因为现在很难解决任何问题,因为我看不到psexec输出)。
    • 在Java的姐妹项目中,情况正好相反,不捕获输出也会以类似的方式失败
  • -始终包括accepteula
  • PAExec似乎也有类似的问题
  • 这个问题似乎和上面描述的非常相似 我观察到PsExec头会立即从所有子项显示,但关于它正在执行的操作、启动和结果的状态行似乎一次只出现一行——这意味着在第一个子项完成之前,第二个子项的状态行直到第一个子项完成之后才会出现。不确定这是否与问题有关

任何帮助都将不胜感激。

我在Git命令行这样锁定时遇到很多问题,因此我编写了一个小库来启动流程:


这将Windows管道用于std(in | out | err),并以不同的方式对System.Diagnostic.Process进行互操作。

您找到了解决此问题的可靠方法吗?@IgorMalin,这是很久以前的事了,所以我不记得了。我想我没有,但老实说,我想不起来了。对不起:(