You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:52:04