PsExec, почему я не получаю полный вывод удаленной команды - PullRequest
0 голосов
/ 29 октября 2018

Почему я НЕ получаю 3 строки вывода при удаленном запуске TestApp? В строке «output» я получаю информацию о лицензии плюс строку «Start @», НО не следующие две строки:

    public static string RunPsExec()
    {
        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.FileName = @"C:\Users\Vence\Downloads\PSTools\PsExec.exe";
        p.StartInfo.Arguments = @"\\10.215.yy.yy -u xxxxxx -p ""xxxxxx"" C:\Projects\TestApp\TestApp\bin\Debug\TestApp.exe";
        p.Start();

        string output = p.StandardOutput.ReadToEnd();
        string errormessage = p.StandardError.ReadToEnd();

        p.WaitForExit();

        return output;
    }

TestApp:

    static void Main(string[] args)
    {
        Console.WriteLine("Start@ " + DateTime.Now.ToShortTimeString());
        System.Threading.Thread.Sleep(5000);
        Console.WriteLine("Middle@ " + DateTime.Now.ToShortTimeString());
        System.Threading.Thread.Sleep(5000);
        Console.WriteLine("End@ " + DateTime.Now.ToShortTimeString());
    }

1 Ответ

0 голосов
/ 30 октября 2018

Одно из решений, которое я вижу, - установить для RedirectStandardInput значение false, поскольку в этом примере оно не требуется. Однако, если вы хотите передать ввод в TestApp в будущем (для этого требуется RedirectStandardInput = true), одним из решений может быть использование PAexec (https://www.poweradmin.com/paexec/) в качестве альтернативы PsExec. Согласно этим вопросам ( Не удается получить асинхронный вывод из psexec при удаленном запуске приложения ), PAExec записывает напрямую в консольный буфер, вместо stout / sterr. Чтобы это работало, вам нужно будет прочитать вывод асинхронно, например так:

public static string RunPsExec()
{

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.FileName = @"C:\<path_to>\PaExec.exe";
    p.StartInfo.Arguments = @\\10.215.yy.yy -u xxxxxx -p ""xxxxxx"" ""C:\Projects\TestApp\TestApp\bin\Debug\TestApp.exe"" ";
    p.OutputDataReceived += (sender, args) => Display(args.Data);

    p.Start();

    p.BeginOutputReadLine();

    p.WaitForExit(10000);

    return;


}

static void Display(string output)
{
    Console.WriteLine(output);

}
...