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 路径和脚本的已知问题。
我一直在谷歌搜索,但没有找到任何解决方案。路径参数组合的最常见情况有像
这样的引号"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 路径和脚本的已知问题。