尝试使用PSEXEC远程运行.NET命令行工具时,我正在遇到一个奇怪的问题。

  1. 从命令行运行PSEXEC时,它运行并完成。

  2. 从控制台应用程序运行时(创建一个过程,运行PSEXEC.EXE具有必要的参数) - 它运行正常。

  3. 从我们的内部自定义工具运行时,该工具用于运行不同的任务时,它会耗尽或成功完成。

这是我正在使用的代码:

Process p = new Process();

p.StartInfo.FileName = @"C:\PsExec.exe";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

string arg = "-snapshot -display C:\*.msi -s";

p.StartInfo.Arguments = @"\\10.161.203.106 -u user -p pwd -cf C:\FVT.exe " + arg;

Logger.Info(this, "Starting process");

p.Start();
var ended = p.WaitForExit(60 * 1000);

if (!ended)
{
    throw new Exception("Process timed out.");
}

Logger.Info(this, "Process ended");

using (StreamReader sr = p.StandardOutput)
{
    string buffer = sr.ReadToEnd();
    Logger.Info(this, buffer);
}

该代码从CMD线或独立应用程序中运行良好!

我不知道这里还有什么问题。

我们的内部工具产生了一个新线程,并在其中运行此代码。

更新:

命令行 +在命令行窗口中 - 工作。相同的cmd + args,作为带有redirectOutput的过程运行 - 暂停和返回。

这可能是.NET中的错误吗? (这对于其他Progarm,批处理文件等发生了)。

有帮助吗?

解决方案

我不知道错误 , ,但是我有一个直觉,如果您重定向stderr(RedirectStandardError = true)并阅读stderr流(就像与Stdout一样)会告诉您。或者,在调试休假时 CreateNoWindow = false 也许您会看到控制台消息(尤其是如果它在等待按键;否则它可能会消失得太快而无法注意到)。

请注意,如果该过程未终止,则可能需要在Stdout/stderr上设置异步读取器。您可以在额外的线程上或通过 OutputDataReceived / ErrorDataReceived 事件(您需要设置 EnableRaisingEventstrue 还)。


如果说 仍然 不起作用;您可以尝试与 UseShellExecute=true. 。这意味着您将无法重定向IO,因此您可能必须使用 > / >> 等待将输出输送到文件(理想情况下是在温度下),然后读取文件。

其他提示

尝试将-pocepteula添加到PSEXEC中

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top