mynametaken Ответов: 1

Как правильно перенаправить вывод консоли в строку?


Привет
Я работаю с Windows Form с командными строками. Я пытаюсь перенаправить вывод консоли на строку правильно, чтобы я мог захватить текст с помощью регулярного выражения, но это не то, что я хотел, он просто выводит что-то вроде этого:

Microsoft Windows [Version 10.0.15063]
(c) 2017 Microsoft Corporation. Alle rettigheder forbeholdes.

D:\example\test >> "D:\example\test\log.txt"

D:\example>aapt.exe dump badging <filepath>

D:\example>


Видите ли, он выводит авторские права и мои входные данные. На самом деле он ничего не выводит из aapt.exe.

Это код, который я использовал

p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.CreateNoWindow = true;

p.Start();
p.StandardInput.WriteLine("aapt.exe dump badging \"" + path + "\"");
p.StandardInput.Close();
string str = p.StandardOutput.ReadToEnd();


Что я уже пробовал:

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

Мне всегда приходилось перенаправлять вывод консоли в файл в качестве обходного пути, например:

p.Start();
p.StandardInput.WriteLine("aapt.exe dump badging \"" + path + "\" >> \"" + logs + "\" 2>&1");
p.StandardInput.Close();


Таким образом, он выводит следующее без авторских прав, версии windows и моих входных данных

package: name='org.schabi.newpipe' versionCode='27' versionName='0.9.0' platformBuildVersionName='7.1.1'
sdkVersion:'15'
targetSdkVersion:'25'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission: name='android.permission.SYSTEM_ALERT_WINDOW'
application-label:'NewPipe'
application-label-af:'NewPipe'
...


Надеюсь, вы сможете мне помочь.
Спасибо.

Richard MacCutchan

Ваш StartInfo.FileName является cmd.exe, но это должен быть полный путь aapt.exe.

1 Ответов

Рейтинг:
2

Steve44

Одна из проблем может заключаться в том, что у вас нет возможности узнать, когда aapt.exe завершает выполнение и считывает потоки до того, как произойдет какой-либо вывод. Помните, что вы создаете процесс, который работает параллельно с вашим приложением.

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

// Execute the program
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();

// Execute another program
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();

Теперь выход должен быть в str.
В зависимости от того, в какой поток приложение записывает свои выходные данные, вам может потребоваться прочитать p.StandardError.ReadToEnd()(Во втором примере вы перенаправляете оба файла в один и тот же файл журнала с помощью "2>&1".)


mynametaken

Спасибо, но как насчет нескольких аргументов?

Steve44

Как вы бы предоставили несколько аргументов в оболочке: разделенных пробелами. Пример уже использует 3 аргумента:
"dump", "badging" и путь в кавычках.

mynametaken

Извините я имею в виду несколько команд как вы будете выполнять aapt.exe по-другому после первой команды и выполнить cmd.exe, adb.exe и так далее ... после aapt.exe

Steve44

Просто обновил решение для второй программы.