One problem could be that you have no way of knowing, when the aapt.exe completes execution and read the streams before any output happened. Remember, you are creating a process that is running in parallel with your application.
You are making this unnecessary complex by invoking a shell and then simulating an input. Here a snippet that should do the same for you and gives you more control, e.g. over waiting for your process to complete:
p.StartInfo.FileName = "aapt.exe";
p.StartInfo.WorkingDirectory = "<path to aapt.exe>";
p.StartInfo.Arguments = "dump badging \"" + path + "\"";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
string str = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p2.StartInfo.FileName = "adb.exe";
p2.StartInfo.WorkingDirectory = "<path to adb.exe>";
p2.StartInfo.Arguments = "<arguments for adb.exe>";
p2.StartInfo.UseShellExecute = false;
p2.StartInfo.RedirectStandardOutput = true;
p2.StartInfo.RedirectStandardError = true;
p2.StartInfo.RedirectStandardInput = true;
p2.StartInfo.CreateNoWindow = true;
p2.Start();
string str2 = p2.StandardOutput.ReadToEnd();
p2.WaitForExit();
Now the output should be in str.
Depending to which stream the application writes its output, you might need to read
p.StandardError.ReadToEnd()
. (In your second sample you are redirecting both to the same log file with "
2>&1
".)