Вопрос:
когда я пишу в adb:
adb shell dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’
Я получаю вывод ошибки:
‘grep’ is not recognized as an internal or external command, operable program or batch file.
но если я разделил его на два оператора:
adb shell dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’
он работает нормально (он дает название основной деятельности запущенного приложения).
если единственный способ состоит в том, чтобы разделить его на два – это meens, которые сначала входят в оболочку adb, а затем запускают запрос, есть способ сделать это из С#?
в моем коде, он выполняет только первую часть (ввод оболочки).
вот мой код:
public static void startNewProccess(object startInfo) { p = new Process(); p.StartInfo = (System.Diagnostics.ProcessStartInfo)startInfo; p.Start(); p.WaitForExit(); } public static void getMainActivity() { var startInfo1 = new System.Diagnostics.ProcessStartInfo { WorkingDirectory = @ADB_FOLDER, WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal, FileName = «cmd.exe», Arguments = «/c» + » adb shell», //adb shell am start -n com.package.name/com.package.name.ActivityName UseShellExecute = false }; startNewProccess(startInfo1); var startInfo2 = new System.Diagnostics.ProcessStartInfo { WorkingDirectory = @ADB_FOLDER, WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal, FileName = «cmd.exe», Arguments = «/c» + » dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp'», UseShellExecute = false }; } Ответ №1
В adb нет проблемы с grep. Существует проблема с вашим пониманием того, как работает shell. Поэтому давайте исправить это:
В вашей команде adb shell dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’ только часть dumpsys window windows запускается на Android. Команды adb shell и grep запускаются на вашем ПК с ОС Windows. Таким образом, вы получите ошибку – у вас просто нет grep.
Когда вы запускаете только adb shell – вы запускаете интерактивный сеанс оболочки adb, и все, что вы вводите, выполняется на стороне Android. Это отлично подходит для ручного тестирования. Но добавляет дополнительный уровень сложности при использовании для автоматизации. Чтобы использовать интерактивный режим из вашего кода, вам понадобится несколько потоков (один для самой оболочки, другой для отправки команд).
Но в вашем случае вам не нужна вся эта сложность – просто избегайте символа “pipe” или поместите всю команду оболочки в кавычки следующим образом:
adb shell «dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp'»