Как поймать%ERRORLEVEL% при запуске Psexec.exe в C#, сохранить в файл журнала

Я использую psexec.exe для установки некоторых программ на большое количество компьютеров. Я хотел бы иметь возможность поймать%ERRORLEVEL% (или его эквивалент C#) и записать их в файл TXT. ( cmd.exe завершен на 6440-nbpb00f51w с кодом ошибки 0.)

После обширных исследований я нахожу несколько возможностей. Моя конечная цель будет иметь файл.CSV. Каждая строка будет иметь имя компьютера и выходные данные команды psexec. Используя эти данные, я смогу определить, на каких компьютерах обновление прошло успешно.

string[] pcnamearray = new string[] {"COMPUTERNAME1", "COMPUTERNAME2"};
foreach (string i in pcnamearray)
{
    Process p = new Process();
    string psexeclaunch = "psexec.exe";
    p.StartInfo.FileName = psexeclaunch;
    p.StartInfo.RedirectStandardOutput = false;
    p.StartInfo.UseShellExecute = true;
    p.StartInfo.CreateNoWindow = false;
    string arg = "/silent";
    p.StartInfo.Arguments = @" -i \\" + i + @" -u mydomain\admin -p mypassword -h                -e cmd.exe /c start \\networkserver\sw\myfile.exe" + arg;
    p.Start();
}

Я здесь не ищу кого-то, чтобы написать код для меня. Я здесь, чтобы спросить людей за их совет или прошлый опыт с этим. Я знаю, что есть несколько различных методов. В идеале, я бы предпочел иметь короткую строку для каждого результата, но если мне нужно взять весь вывод и использовать макросы, чтобы сбрить их до более удобочитаемой формы, это тоже хорошо.

Пока что я пробовал:

Console.WriteLine(p.StandardOutput.ReadToEnd());

А также...

System.IO.File.WriteAllLines(@"C:\Users\areu2447\Desktop\UpdateDAT\Final\out.txt", lines);

А также...

FileStream filestream = new FileStream(@"C:\Users\areu2447\Desktop\UpdateDAT\Final\out.txt", FileMode.Append);
var streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);

Последний кажется мне лучшим, но не может заставить его работать. Я попытался включить его в мой цикл foreach, но файл используется другим процессом, поэтому, просмотрев его, я обнаружил, что он должен быть сам по себе. Даже с одним только я все еще не могу заставить это работать.

Пожалуйста, помогите / посоветуйте!

Я смог заставить его изменить файл TXT, даже если в него ничего не было добавлено, с помощью следующего:

                    System.IO.StreamReader reader = p.StandardOutput;
                    String sRes = reader.ReadToEnd();
                    StreamWriter SW;
                    SW = File.CreateText(@"C:\Users\areu2447\Desktop\UpdateDAT\Final\out.txt");
                    SW.WriteLine(sRes);
                    SW.Close();
                    Console.WriteLine("File Created Successfully");
                    reader.Close();

1 ответ

Я бы рекомендовал использовать System.Management.Automation для создания конвейера PowerShell и выполнения сценария в процессе.

Выполнение сценариев PowerShell из C#

Другие вопросы по тегам