从`IEnumerable`字符串创建命令行

时间:2015-01-21 09:22:50

标签: c# .net

问题:.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 Runtime的规则。
我想他们说的是需要在包含空格的参数周围引用,并且在参数内转义引号。

1 个答案:

答案 0 :(得分:0)

没有这样的内置功能。你可以编写自己的(从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();       
    }));
}