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

C# - Split executable path and arguments into two strings

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

这样的引号

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

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

他们只是简单地检查整个事情,寻找第二个引用,然后将其后的所有内容都视为一个论点。

.

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

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

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

这以相同的方式工作。他们寻找第一个 space 然后将其后的所有内容视为参数,这不适用于 some/most 程序(程序文件文件夹名称具有 space)。

.

有解决办法吗?我尝试使用和调整许多片段,甚至尝试制作我自己的正则表达式语句,但它们都失败了。代码片段甚至库都会派上用场。

提前致谢!

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

片段 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:各种黑幕博客

您可以尝试像 .NET 中唯一的板载 CSV 解析器,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[],第一个是路径,其余是参数。

Update:这适用于除最后一个字符串之外的所有字符串,因为路径是 C:\Program Files\Sample.exe。您必须将其用引号引起来,否则 Program Files 中的 space 会将它们分成两部分,但这是 windows 路径和脚本的已知问题。