2014-10-27 3 views
4

, когда я пишу в ADB:проблемы с командой 'Grep' от 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' 

работает нормально (он дает название основной деятельности запущенного приложения).

Если единственный способ состоит в том, чтобы разделить его на две части - это мены, которые сначала входят в оболочку adb, а затем запустить запрос, есть способ сделать это из C#?

в моем коде, это только первая часть (ввод оболочка).

вот мой код:

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

ответ

16

Там нет проблемы с grep в adb. Существует проблема с вашим пониманием того, как работает shell. Итак, давайте исправим это:

В вашей команде adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' только dumpsys window windows часть работает на Android. Команды adb shell и grep запускаются на вашем ПК с ОС Windows. Таким образом, вы получите ошибку - у вас просто нет grep.

Когда вы запускаете только adb shell - вы начинаете интерактивную сессию оболочки adb, и все, что вы вводите, выполняется на стороне Android. Это отлично подходит для ручного тестирования. Но добавляет дополнительный уровень сложности при использовании для автоматизации. Чтобы использовать интерактивный режим из вашего кода, вам понадобится несколько потоков (один для самой оболочки, другой для отправки команд).

Но в вашем случае, если вы на самом деле не нужны все эти сложности - просто избежать «трубы» характера или поставить команду целой оболочки в кавычках, как это:

adb shell "dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'" 
+1

Да, это ключевое различие. Хотя стоит отметить, что только в последних нескольких версиях оболочка Android включала «grep», поэтому версия не будет работать только с более старыми устройствами. Можно легко получить grep для окон, т. Е. От MSys, Cygwin или многих других источников. Но если захватить данные в программу, можно также выполнить соответствующую строку в программе потребления, а не в зависимости от инструмента, который может или не может существовать на конкретном хосте или устройстве. –