Как поймать%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 и выполнения сценария в процессе.