C# - 将可执行路径和参数拆分为两个字符串

时间:2015-04-23 14:50:22

标签: c# regex command-line split arguments

我一直在做一些谷歌搜索,但没有找到任何解决方案。路径参数组合的最常见情况是引用,如

"C:\Program Files\example.exe" -argument --argument -argument "argument argument"

"C:\Program Files\example.exe" /argument /argument /argument "argument argument"

他们只是通过整个事情,寻找第二个引用,然后将其后的所有内容视为一个论点。

我找到的第二个解决方案(see here)无需引号即可工作但仅适用于没有空格的路径。见下文。

这有效:C:\Windows\System32\Sample.exe -args -args -args "argument argument"

这不起作用:C:\Program Files\Sample.exe -argument "arg arg" --arg-arg

这以同样的方式工作。他们寻找第一个空格,然后将其后的所有内容视为参数,这对于某些/大多数程序都不起作用(程序文件文件夹名称有空格)。

有解决方案吗?我试图使用和调整大量的片段甚至试图制作我自己的正则表达式声明,但它们都失败了。代码片段甚至图书馆都会派上用场。

提前致谢!

编辑:我根据要求找到的代码段

摘录1:

char* lpCmdLine = ...;
char* lpArgs = lpCmdLine;
// skip leading spaces
while(isspace(*lpArgs))
    lpArgs++;
if(*lpArgs == '\"')
{
    // executable is quoted; skip to first space after matching quote
    lpArgs++;
    int quotes = 1;
    while(*lpArgs)
    {
        if(isspace(*lpArgs) && !quotes)
            break;
        if(*lpArgs == '\"')
            quotes = !quotes;
    }
}
else
{
    // executable is not quoted; skip to first space
    while(*lpArgs && !isspace(*lpArgs))
        lpArgs++;
}
// TODO: skip any spaces before the first arg

来源2:几乎here

中的所有内容

来源3:各种阴暗的博客

1 个答案:

答案 0 :(得分:2)

您可以尝试使用CSV解析器,例如.NET中的唯一版本,VisualBasic.TextFieldParser

List<string[]> allLineFields = new List<string[]>();
var textStream = new System.IO.StringReader(text);
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(textStream))
{
    parser.Delimiters = new string[] { " " };
    parser.HasFieldsEnclosedInQuotes = true; // <--- !!!
    string[] fields;
    while ((fields = parser.ReadFields()) != null)
    {
        allLineFields.Add(fields);
    }
}

使用单个字符串,列表包含一个String[],第一个是路径,其余是args。

更新:这适用于除最后一个字符串以外的所有字符串,因为路径为C:\Program Files\Sample.exe。您必须将其包装在引号中,否则Program Files中的空格将它们分成两部分,但这是Windows路径和脚本的已知问题。