aapt命令在CMD正常运行但C# Process调用失效问题排查
问题原因
管道符|是Windows CMD的内置功能,并非aapt程序的参数。直接把带管道的完整命令传给Process的FileName时,Process会将管道及后续内容当作aapt的输入参数,而非触发CMD的管道过滤逻辑,因此aapt会直接输出完整的APK badging信息,不会执行后续的grep和sed过滤。
解决办法
必须通过cmd.exe来执行整个带管道的命令,利用CMD解析管道符并完成命令链的执行。
修正后的代码示例
using System.Diagnostics; var startInfo = new ProcessStartInfo { FileName = "cmd.exe", // 用/c参数让CMD执行命令后退出,外层双引号包裹完整命令,内部路径引号转义 Arguments = @"/c ""aapt d badging \"c:\adb\apks\ftp\ftp.apk\" | \"C:\adb\grep\" package | \"c:\adb\sed\" -r \"s/package: name='([a-z0-9.]*)'.*/\1/""", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true, RedirectStandardError = true // 可选,用于捕获错误信息排查问题 }; using var process = Process.Start(startInfo); var result = process.StandardOutput.ReadToEnd().Trim(); var error = process.StandardError.ReadToEnd(); process.WaitForExit(); // 输出结果或错误信息 Console.WriteLine(result); if (!string.IsNullOrEmpty(error)) Console.WriteLine($"错误信息:{error}");
关键注意事项
/c是CMD的核心参数,用于指定执行完后续命令后立即退出- 命令字符串必须用外层双引号包裹,内部的路径引号需要用
\"转义,防止CMD因路径空格解析出错 - 必须设置
UseShellExecute = false,否则无法重定向标准输出;CreateNoWindow = true可避免弹出CMD窗口
内容的提问来源于stack exchange,提问作者StealthRT
相关产品推荐
相关产品推荐

