How to catch %ERRORLEVEL% when running Psexec.exe in C#, save to log file

479 Views Asked by At

I am using psexec.exe to install some software on a large amount of computers. I would like to be able to catch the %ERRORLEVEL% (or its c# equivalent) and write them to a TXT file. ( cmd.exe exited on 6440-nbpb00f51w with error code 0.)

After extensive research, I am finding several possibilities. My end-goal will be to have a .CSV file. Each row would have the computer name and the output of the psexec command. Using this data I will be able to determine which computers the update was successful on.

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();
}

I am not here looking for someone to write the code for me. I am here to ask people for their advice, or past experiences with this. I know there are several different methods available. Ideally, I would prefer to have a short sweet line for each result, but if i have to take the entire output and use macros to shave them down to a more readable form, that is fine too.

So far, I have tried:

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

And...

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

And...

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);

The last one seems to me like the best one but cannot seem to get it to work. I have tried including it in my foreach loop, but file is in use by another process, so after looking into it i found that it needed to be on its own. Even with it alone, i still cannot get it to work.

Please help/advise!

I was able to get it to actaully modify my TXT file, even though there was nothing added to it, by using the following:

                    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

There are 1 best solutions below

0
On

I would recommend using System.Management.Automation to create a PowerShell pipeline and run the script in process.

Executing PowerShell scripts from C#