我有一个包含可执行文件路径的字符串,该文件也可能包含或不包含命令行参数。
例如:
"C:\Foo\Bar.exe"
"C:\Foo\Bar.exe /test"
"C:\Foo\Bar.exe {0}"
"C:\Foo\Bar.exe -snafu"
我正在尝试将字符串分解为路径部分和参数部分。参数部分可以是几乎任何格式。但IO.Path函数假定字符串是没有争论的路径。例如,如果我打电话:
IO.Path.GetFileName(path)
返回Bar.exe /test
,Bar.exe {0}
或Bar.exe -snafu
当我在命令提示符下运行时,Windows显然可以区分,因此必须有一些方法来利用现有函数。
如果需要,我可以在引号中包围字符串的路径部分。但是IO.Path
调用失败了。例如:
? IO.Path.GetFileName("""C:\Windows\write.exe"" {0}")
引发争议异常:路径中的非法字符。
答案 0 :(得分:2)
答案 1 :(得分:1)
CommandLineToArgvW
将是Sorceri提到的最佳方法(你可以看到example code here),但这里有一个天真的实现,可能就足够了。这假定文件扩展名始终存在。
string input = @"C:\Foo\Bar test\hello.exe {0}";
string[] split = input.Split(' ');
int index = 0;
string ext = String.Empty;
string path = "";
string arguments = "";
while (true)
{
string testPath = String.Join(" ", split, 0, index);
ext = Path.GetExtension(testPath);
if (!String.IsNullOrEmpty(ext))
{
path = Path.GetFullPath(testPath);
arguments = input.Replace(path, "").Trim();
break;
}
index++;
}
Console.WriteLine(path + " " + arguments);
您可以添加处理,以便在未找到扩展名的情况下while
循环不会永久运行。我只用你帖子中的三个网址测试了它,所以你可能想测试其他场景。