2011-03-03 88 views
2

我所要做的就是發送一個命令,用program.exe打開一個模型 假設超級簡單!使用C執行命令行#

例:

"C:\Program Files (x86)\River Logic\Enterprise Optimizer 7.4 Developer\EO74.exe" "C:\PauloXLS\Constraint Sets_1.cor" 

上面的線工作良好,如果在命令提示窗口上粘貼。 但是,試圖通過對我的代碼完全相同的字符串時,它被貼在C:\ PROGRAM

string EXE = "\"" + @tbx_base_exe.Text.Trim() + "\""; 
string Model = "\"" + @mdl_path.Trim()+ "\""; 

string ExeModel = EXE + " " + Model; 

MessageBox.Show(ExeModel); 

ExecuteCommand(ExeModel); 

ExeModel爲顯示在Visual Studio的行蒂

"\"C:\\Program Files (x86)\\River Logic\\Enterprise Optimizer 7.4 Developer\\EO74.exe\" \"C:\\PauloXLS\\Constraint Sets_1.cor\"" 

對我看起來像這是我需要發送到以下方法的字符串:

public int ExecuteCommand(string Command) 
{ 
    int ExitCode; 
    ProcessStartInfo ProcessInfo; 
    Process Process; 

    ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command); 
    ProcessInfo.CreateNoWindow = true; 
    ProcessInfo.UseShellExecute = true; 

    Process = Process.Start(ProcessInfo); 
    Process.WaitForExit(); 
    ExitCode = Process.ExitCode; 
    Process.Close(); 

    return ExitCode; 
} 

事情我已經嘗試:

  1. 一次僅傳遞一個命令(按預期工作),但不是一個選項,因爲模型文件將用另一個版本的軟件打開。
  2. 試過修剪
  3. 試圖用@與\」

任何人都可以看到任何明顯的錯誤?謝謝。

+6

爲什麼使用'cmd.exe/K ...'而不是直接調用程序?這可以讓你避免逃離空間的麻煩...... – Heinzi 2011-03-03 15:32:36

+0

是的,使用Process.Start來調用你想要的實際EXE。這將避免任何你可能需要「雙重轉義」特殊字符的地方出現的問題。 – KeithS 2011-03-03 15:35:42

+1

無論存在某種方法。您必須將命令字符串轉義爲作爲參數傳遞給cmd.exe,或者您必須解析原始命令以將參數文件名與參數分隔開,以便將它們傳遞給Process.Start,這需要它們分別傳遞。如果你將他們分開,那很簡單。但是,如果給定一個包含文件名和參數的單個命令字符串,那麼將字符串轉義並傳遞給cmd.exe可能不太複雜,而不是試圖將文件名與參數分開通過檢查引用的名稱或空格。 – Triynko 2013-04-18 20:13:38

回答

3

你爲什麼要打開一個命令提示符(cmd.exe的)?只是通過。可執行文件的名稱

+0

儘管NativeMethods.CreateProcess需要整個命令行作爲一個字符串的事實,的Process.Start需要你先解析命令行的文件名從參數分離回,只爲Process.StartWithCreateProcess重組成一個單一的字符串通過Process.BuildCommandLine方法。該框架典當這個額外的任務,關上了我們,因爲它需要他們分開SHELLEXECUTEINFO當UseShellExecute標誌設置,所以需要結合文件名+參數的容易的事,留給我們做了解析文件名的髒活。尼斯:P – Triynko 2013-04-18 20:06:41

+1

我的觀點是......這樣或那樣的,你將不得不去通過一些麻煩得到一個任意的命令來運行。您要麼必須轉義命令才能將其傳遞到cmd.exe,要麼必須解析該命令以將(可執行)文件名與參數分開,以將它們傳遞給Process.Start。它可以說並不複雜(給出一個用戶輸入的命令行字符串)來轉義整個字符串並將其傳遞給cmd.exe,而不是試圖將文件名與參數隔離開來,因爲文件名可能包含在引號或可能包含空格等 – Triynko 2013-04-18 20:06:56

6

這是非常簡單,您只需要創建一個命令行對象,然後寫,然後執行它,你使用SR.ReadToEnd()從中讀回:

private string GETCMD() 
{ 
    string tempGETCMD = null; 
    Process CMDprocess = new Process(); 
    System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo(); 
    StartInfo.FileName = "cmd"; //starts cmd window 
    StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    StartInfo.CreateNoWindow = true; 
    StartInfo.RedirectStandardInput = true; 
    StartInfo.RedirectStandardOutput = true; 
    StartInfo.UseShellExecute = false; //required to redirect 
    CMDprocess.StartInfo = StartInfo; 
    CMDprocess.Start(); 
    System.IO.StreamReader SR = CMDprocess.StandardOutput; 
    System.IO.StreamWriter SW = CMDprocess.StandardInput; 
    SW.WriteLine("@echo on"); 
    SW.WriteLine("cd\\"); //the command you wish to run..... 
    SW.WriteLine("cd C:\\Program Files"); 
    //insert your other commands here 
    SW.WriteLine("exit"); //exits command prompt window 
    tempGETCMD = SR.ReadToEnd(); //returns results of the command window 
    SW.Close(); 
    SR.Close(); 
    return tempGETCMD; 
} 
+0

你稱之爲直截了當? – TomWardrop 2014-03-26 00:24:19

+0

確定它很簡單,只需複製並粘貼... ;-)雖然,不是太糟糕。所有的命令都是爲個人喜好設置的。所以實際上只有少數幾個實際需要的命令。很好地創建一個程序化的命令行。 – Davido 2014-04-09 20:10:19