.NET Framework下如何将参数列表正确传递给ProcessStartInfo?
可用方案如下:
方案1:使用官方内置类实现(最稳妥)
.NET Framework 2.0及以上版本都自带了命令行参数拼接的官方实现,位于Microsoft.VisualBasic程序集中的Microsoft.VisualBasic.ApplicationServices.CommandLineBuilder类,该类会自动按照Windows平台标准规则处理参数转义,仅在参数包含空格、引号等特殊字符时才会自动包裹引号,不会修改无特殊字符的普通参数(例如-u会保持原样,不会被包裹为"-u"),完美匹配需求。
使用示例:
// 需要先在项目中添加对 Microsoft.VisualBasic 程序集的引用 using Microsoft.VisualBasic.ApplicationServices; using System.Diagnostics; // 你的原始已解析参数数组 string[] inputArgs = { @"C:\Program Files\My App\data.dat", "-u", "admin", "--path", @"D:\Test Folder\config.ini" }; CommandLineBuilder argBuilder = new CommandLineBuilder(); foreach (string arg in inputArgs) { argBuilder.AppendArgument(arg); } ProcessStartInfo startInfo = new ProcessStartInfo("target_program.exe"); startInfo.Arguments = argBuilder.ToString(); // 后续启动进程逻辑
方案2:无额外依赖的自实现方案
如果你不想引用Microsoft.VisualBasic程序集,可以直接使用符合Windows标准命令行解析规则的转义实现,逻辑如下:
using System; using System.Linq; using System.Text; using System.Diagnostics; public static class CommandLineUtil { public static string BuildArguments(string[] args) { return string.Join(" ", args.Select(EscapeSingleArgument)); } private static string EscapeSingleArgument(string arg) { if (string.IsNullOrEmpty(arg)) { return "\"\""; } // 无特殊字符的参数不需要加引号 if (arg.IndexOfAny(new[] { ' ', '\t', '\n', '"' }) < 0) { return arg; } StringBuilder sb = new StringBuilder(); sb.Append('"'); int backslashCounter = 0; foreach (char c in arg) { if (c == '\\') { backslashCounter++; continue; } if (c == '"') { // 引号前的反斜杠需要双倍转义,再加一个转义引号的反斜杠 sb.Append('\\', backslashCounter * 2 + 1); sb.Append(c); } else { sb.Append('\\', backslashCounter); sb.Append(c); } backslashCounter = 0; } // 末尾的反斜杠需要双倍转义 sb.Append('\\', backslashCounter * 2); sb.Append('"'); return sb.ToString(); } } // 调用示例 string[] inputArgs = { @"C:\Program Files\My App\data.dat", "-u", "admin", "--path", @"D:\Test Folder\config.ini" }; ProcessStartInfo startInfo = new ProcessStartInfo("target_program.exe"); startInfo.Arguments = CommandLineUtil.BuildArguments(inputArgs);
两种方案都已经覆盖了所有边界场景,包括参数带内嵌引号、末尾反斜杠、混合特殊字符等情况,不会出现参数拆分错误或者不必要的引号包裹问题。
内容的提问来源于stack exchange,提问作者AyCe
相关产品推荐
相关产品推荐

