C#调用cmd.exe执行adb push命令无法向安卓模拟器传输文件如何解决
问题原因
- 路径字符串转义错误:C#代码中传递的文件路径
"Debug\funnels\01\01.mp4"没有使用逐字字符串标记@,反斜杠会被识别为转义符:\f匹配换页符、\0匹配空字符,最终传递给adb的路径完全错误,无法找到待推送文件。 - 缺少错误输出捕获:代码关闭了标准输出重定向,无法获取adb执行时的错误提示(比如文件不存在、设备未连接、权限不足等),难以定位问题。
- 冗余的cmd调用:额外调用cmd.exe属于不必要的中间层,直接调用adb.exe执行命令稳定性更高。
修复方案
方案1:修正现有代码的转义问题
只需要给文件路径添加逐字字符串标记@即可解决路径错误问题,同时开启错误输出捕获方便排查问题:
Process cmd = new Process(); cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.WorkingDirectory = @"C:\Users\NewSystem\source\repos\"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardError = true; // 开启错误输出捕获 cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = false; cmd.StartInfo.UseShellExecute = false; cmd.Start(); // 给路径添加@标记,避免转义问题 cmd.StandardInput.WriteLine(@"adb -s emulator-5554 push Debug\funnels\01\01.mp4 /sdcard/Download"); cmd.StandardInput.Flush(); cmd.StandardInput.Close(); // 输出执行日志方便排查 string output = cmd.StandardOutput.ReadToEnd(); string error = cmd.StandardError.ReadToEnd(); Console.WriteLine("执行输出:" + output); Console.WriteLine("错误信息:" + error); cmd.WaitForExit();
方案2:更稳定的直接调用adb方案
跳过cmd.exe中间层,直接调用adb执行命令,性能和稳定性更高:
Process adbProc = new Process(); // 建议直接写全adb.exe的绝对路径,避免环境变量未配置导致找不到adb的问题,比如: // adbProc.StartInfo.FileName = @"C:\platform-tools\adb.exe"; adbProc.StartInfo.FileName = "adb.exe"; adbProc.StartInfo.WorkingDirectory = @"C:\Users\NewSystem\source\repos\"; // 命令参数直接放在Arguments属性中 adbProc.StartInfo.Arguments = @"-s emulator-5554 push Debug\funnels\01\01.mp4 /sdcard/Download"; adbProc.StartInfo.RedirectStandardError = true; adbProc.StartInfo.RedirectStandardOutput = true; adbProc.StartInfo.CreateNoWindow = true; adbProc.StartInfo.UseShellExecute = false; adbProc.Start(); string output = adbProc.StandardOutput.ReadToEnd(); string error = adbProc.StandardError.ReadToEnd(); Console.WriteLine("执行输出:" + output); Console.WriteLine("错误信息:" + error); adbProc.WaitForExit();
额外注意点
- 如果执行后仍然报错,优先看捕获到的错误信息:如果提示
adb command not found,就把FileName改成adb.exe的绝对路径;如果提示no such file or directory,就检查本地文件路径是否正确、模拟器的/sdcard/Download目录是否存在、模拟器是否开启了文件读写权限。 - 确保执行代码时模拟器已经正常启动,且
adb devices命令可以识别到emulator-5554设备。
内容的提问来源于stack exchange,提问作者Bella Smith
相关产品推荐
相关产品推荐

