2014-01-15 122 views
1

我试图运行快速的adb shell命令。基本上,我想启动adb shell,然后连续运行一堆命令。我能否以某种方式重用流程?我想要启动adb shell并在运行时更改命令文本。在C#控制台应用程序中快速运行ADB Shell命令

问题是,为每个命令创建一个单独的进程加快了很多进程,并最终adb在我身上。

static void Main(string[] args) 
    { 
     const string AdbBroadcast = "shell am broadcast <my_cmd>"; 


     int broacastIndex = 0; 
     while(true) 
     { 
      Console.WriteLine("Outputting " + broacastIndex); 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      startInfo.FileName = "adb"; 
      startInfo.Arguments = AdbBroadcast; 
      process.StartInfo = startInfo; 
      process.Start(); 

      process.WaitForExit(); 


      Thread.Sleep(250); 
      broacastIndex++; 

     } 

    } 
+1

我不知道这是否会与您的特定错误帮助,但是你应该调用。当你完成它时(在'WaitForExit'之后),对你的进程进行处理。如果这个循环有很多迭代,你可能会在操作系统级别用完处理句柄。处理过程应该释放句柄,以便可以重复使用。 –

回答

0

当设备不响应​​通过外壳经由过程亚行发出的命令,你可以检查设备状态类似如下:

ProcessStartInfo lcmdInfo1; 

    lcmdInfo1 = new ProcessStartInfo(" adb.exe ", "get-state"); 
    lcmdInfo1.CreateNoWindow = true; 
    lcmdInfo1.RedirectStandardOutput = true; 
    lcmdInfo1.RedirectStandardError = true; 
    lcmdInfo1.UseShellExecute = false; 

    Process cmd2 = new Process(); 
    cmd2.StartInfo = lcmdInfo1; 

    var output = new StringBuilder(); 
    var error = new StringBuilder(); 

    cmd2.OutputDataReceived += (o, ef) => output.Append(ef.Data); 
    cmd2.ErrorDataReceived += (o, ef) => error.Append(ef.Data); 
    cmd2.Start(); 
    cmd2.BeginOutputReadLine(); 
    cmd2.BeginErrorReadLine(); 
    cmd2.WaitForExit(); 
    cmd2.Close(); 
    lresulterr1 = error.ToString(); 
    lresult1 = output.ToString(); 
    cmd2.Dispose(); 

    //sometimes there is an issue with a previously issued command that causes the device status to be 'Unknown'. Wait until the device status is 'device' 
    while (!lresult1.Contains("device")) 
    { 
     lcmdInfo1 = new ProcessStartInfo(" adb.exe ", "get-state"); 
     lcmdInfo1.CreateNoWindow = true; 
     lcmdInfo1.RedirectStandardOutput = true; 
     lcmdInfo1.RedirectStandardError = true; 
     lcmdInfo1.UseShellExecute = false; 

     cmd2 = new Process(); 
     cmd2.StartInfo = lcmdInfo1; 

     output = new StringBuilder(); 
     error = new StringBuilder(); 

     cmd2.OutputDataReceived += (o, ef) => output.Append(ef.Data); 
     cmd2.ErrorDataReceived += (o, ef) => error.Append(ef.Data); 
     cmd2.Start(); 
     cmd2.BeginOutputReadLine(); 
     cmd2.BeginErrorReadLine(); 
     cmd2.WaitForExit(); 
     cmd2.Close(); 
     lresulterr1 = error.ToString(); 
     lresult1 = output.ToString(); 
     cmd2.Dispose(); 
    } 
//now your device is ready. Go ahead and fire off the shell commands 
相关问题