2011-03-03 89 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