2013-08-26 26 views
2

我有一个字符串包含一个可执行文件的路径,该文件也可能有也可能没有命令行参数。如何从字符串中提取没有参数的文件的路径?

例如:

"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 /testBar.exe {0}Bar.exe -snafu

Windows可以明显地看出其中的差别,当我运行这个在命令提示符所以必须有某种方式来充分利用现有的功能。

如果需要的话,我可以在引号中围绕字符串的路径部分。但那么IO.Path调用失败。例如:

? IO.Path.GetFileName("""C:\Windows\write.exe"" {0}") 

引发一个参数异常:路径中的非法字符。

+0

该路径始终是一个不间断的字符串,不是?我们不能用空格分隔它并取第一个标记吗? – Shoe

+0

再看看'正则表达式'和'路径' – 2013-08-26 23:18:44

+0

某些路径可能包含空格。例如'C:\ Program Files \ Microsoft Office \ Office15 \ WINWORD.EXE' –

回答

2
+0

这将返回垃圾在我的64位计算机。仍然看着它... –

+0

显示您用来调用它的PInvoke,作为对原始问题的编辑。 –

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循环不未找到扩展的情况下,一直运行下去。我只在你的文章中测试了三个URL,所以你可能想测试其他场景。

相关问题