从字符串的“IEnumerable”创建命令行

Make command line from `IEnumerable` of strings

问题:.NET(或 PInvokable)中是否有函数可以准备命令行(以一个字符串的形式);来自 IEnumerable 个字符串 .

这相当于 python 的 subproces.list2cmdline,但在 .NET 中。

这将与 Win32 的 CommandLineToArgvW 相反。

作为草图,它可能粗略地近似为:

static public string List2CmdLine(IEnumerable<string> args)
{
    return string.Join(" ", args.Select((s) => "\"" + s + "\"")))
}

详情:
python 的 subprocess.list2cmdline documentation 声明他们所做的事情遵循 Windows C 运行时的规则。
我想他们说需要在包含空格的参数周围加上引号,并在参数中转义引号。

没有这样的内置函数。您可以自己编写(翻译自 Python 函数)。

public static string ListToCommandLine(IEnumerable<string> args)
{
    return string.Join(" ", args.Select(a =>
    {
        if (string.IsNullOrEmpty(a)) 
            return "\"\"";

        var sb = new StringBuilder();

        var needQuote = a.Contains(' ') || a.Contains('\t');
        if (needQuote)
            sb.Append('"');

        var backslashCount = 0;

        foreach (var c in a)
        {
            switch (c)
            {
                case '\':
                    backslashCount++;
                    break;

                case '"':
                    sb.Append(new string('\', backslashCount * 2));
                    backslashCount = 0;
                    break;

                default:
                    if (backslashCount > 0)
                    {
                        sb.Append(new string('\', backslashCount));
                        backslashCount = 0;
                    }

                    sb.Append(c);
                    break;            
            }

            if (backslashCount > 0)
                sb.Append(new string('\', backslashCount * (needQuote ? 2 : 1)));

            if (needQuote)
                sb.Append('"');           
        }

        return sb.ToString();       
    }));
}