2011-05-11 173 views
6

有可能通过使用像这样运行在C#中的命令行:从参数的C#运行命令行?

process = new Process(); 
process.StartInfo.FileName = command; 
process.Start(); 

的问题是,如果命令字符串包含的参数,例如:

C:\My Dir\MyFile.exe MyParam1 MyParam2 

这不会工作,我不请参阅如何从此字符串中提取参数并将其设置为process.Arguments属性?路径和文件名可能是别的,该文件不必以exe结束。

我该如何解决这个问题?

+0

所以,问题是,我怎么能命令行分成'FileName'和'Arguments'。 – Jodrell 2011-05-11 12:27:42

+0

听起来像你想要一个正则表达式来找到断点。严格来说,如果文件名包含空格,应该用双引号。这会对你有所帮助。这是这种情况,在你的例子中是文件名'C:\\ My'或'C:\\ My Dir \ MyFile.exe'?顺便说一句,是'M'逃脱了? – Jodrell 2011-05-11 12:31:07

+0

文件是否以点和任何扩展名结尾?例如.com,.exe ... – ibram 2011-05-11 12:46:09

回答

5

如果我理解正确,我会用:

string command = @"C:\My Dir\MyFile.exe"; 
string args = "MyParam1 MyParam2"; 

Process process = new Process(); 
process.StartInfo.FileName = command; 
process.StartInfo.Arguments = args; 
process.Start(); 

如果您有需要解析,我会用其他方法提出这里的人一个完整的字符串。如果您想要为过程添加参数,请使用上述参数。

2

声明:如果文件名包含空格,则必须用双引号括起来。

这在Windows中确实如此。否则,规则变得更加上下文。

看一看regex-matching-spaces-but-not-in-strings,我使用Regex.Split()转换你命令行到一个数组怀疑你可以使用正则表达式,

" +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)" 

。第一部分应该是你的文件名。

3

这可能是最糟糕的解决方案,但它可能更安全的一个:

string cmd = "C:\\My Dir\\MyFile.exe MyParam1 MyParam2"; 
System.IO.FileInfo fi = null; 
StringBuilder file = new StringBuilder(); 
// look up until you find an existing file 
foreach (char c in cmd) 
{ 
    file.Append(c); 
    fi = new System.IO.FileInfo(file.ToString()); 
    if (fi.Exists) break; 
} 

cmd = cmd.Remove(0, file.Length); 
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(fi.Name, cmd); 
System.Diagnostics.Process.Start(psi); 
+0

这是一个不错的主意,它使用环境的上下文来推断字符串的正确性。 +1进行横向思考。如果确实没有引号,也可以使用。 – Jodrell 2011-05-11 17:05:05