2011-05-11 198 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