从字符串的“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();
}));
}
问题:.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();
}));
}