2013-04-16 22 views
6

Voglio eseguire un cmd ed eseguire alcuni comandi al suo interno. Ho scritto questo codice:esecuzione di comandi in cmd utilizzando C#

Process p = new Process(); 
ProcessStartInfo info =new ProcessStartInfo(); 

info.FileName = "cmd.exe"; 
info.WorkingDirectory = this.workingDirectory; 
info.RedirectStandardInput = true; 
info.UseShellExecute = false; 
info.CreateNoWindow = true; 
p.StartInfo = info; 

var x=p.Start(); 
using (StreamWriter sw = p.StandardInput) 
{ 
    if (sw.BaseStream.CanWrite) 
    { 
     sw.WriteLine(@"set path=c:\temp"+ ";%path%"); 
     sw.WriteLine(@"@MyLongproces.exe"); 
    } 
} 

Ma non funziona:

  1. non riesco a vedere la finestra dei comandi (anche quando ho impostato info.CreateNoWindow a false).
  2. Il mio comando non è in esecuzione.

Qual è il problema? e come posso ripararlo?

  • Update1

Questo codice non funziona: viene mostrato

string binDirectory = Path.Combine(FileSystem.ApplicationDirectory, this.binFolderName); 
    ProcessStartInfo info = new ProcessStartInfo("cmd", @"/c " + Path.Combine(binDirectory, command)); 
    info.RedirectStandardInput = false; 
    info.RedirectStandardOutput = true; 
    info.UseShellExecute = false; 
    info.CreateNoWindow = false; 
    System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
    proc.StartInfo = info; 
    proc.Start(); 
    string result = proc.StandardOutput.ReadToEnd(); 

Nessuna finestra cmd e il risultato è "".

Ma questo codice funziona:

 Process.Start(Path.Combine(binDirectory, command)); 

Il problema con il codice di cui sopra è:

  1. non riesco a definire la directory di lavoro.
  2. Mostra una finestra CMD quando non lo voglio mostrare.

Qualche idea sul perché non funziona?

+0

Non ci sono argomenti, aggiungere uno come @ "/ k"; – Derek

+0

Se si desidera solo aprire una directory, è possibile avviare un processo con il percorso della directory, non è necessario eseguire cmd per eseguirlo. – Moondustt

risposta

0

È ancora necessario indicare al processo quale comando si desidera eseguire. In questo caso, suona come si desidera che inizi cmd.exe

1

Si sta impostando l'opzione CreateNoWindow:

info.CreateNoWindow = true; 

ProcessStartInfo.CreateNoWindow - vero se il processo dovrebbe essere iniziato senza creare una nuova finestra per contenere essa; altrimenti, falso. L'impostazione predefinita è false.

0

Prova che:

Prima

p.StartInfo = info; 

Inserire

info.Arguments = "/c ping www.google.com.br"; //command here 
0

Perché si scrive le cose dificult, ecco come eseguire comandi:

try { 

    System.Diagnostics.ProcessStartInfo procStartInfo = 
     new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command); 

    StreamReader.procStartInfo.RedirectStandardOutput = true; 
    procStartInfo.UseShellExecute = false; 

    procStartInfo.CreateNoWindow = true; 

    System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
    proc.StartInfo = procStartInfo; 
    proc.Start(); 

    string result = proc.StandardOutput.ReadToEnd(); 

    Console.WriteLine(result); 
    } 
    catch (Exception objException) 
    { 
     // Log the exception 
    } 
+0

Grazie, Si prega di consultare l'aggiornamento alla domanda. – mans

0

Immagino che tu stia cercando di eseguire MyLongProcess.exe qui. Se sì, non è necessario lanciare il prompt dei comandi.Si può provare il seguente:

//Create process info and set arugments here and then assign it to process object 
// If the exe does not expect any arguments, simply use line below 
Process process = Process.Start("MyLongProcess.exe"); 
0

Si potrebbe provare questo

//Get the paths list and add your custom path to it 
string paths = System.Environment.GetEnvironmentVariable("PATH") + @";C:\temp"; 

//Create a array consisting of all the paths 
string[] pathArray = paths.Split(';'); 

//Search the paths for the first path in which your exe is present 
string exePath = pathArray.Select(x => System.IO.Path.Combine(x, "MyLongproces.exe")) 
          .Where(x => System.IO.File.Exists(x)) 
          .FirstOrDefault(); 

if (string.IsNullOrWhiteSpace(exePath) == false) 
{ 
    //start your exe 
    System.Diagnostics.Process.Start(exePath); 
} 
0

Althought questo è abbastanza vecchia, a mio parere il problema si trova all'interno del parametro specificato per /c di cmd. Se si specifica un argomento con spazi al suo interno, è necessario utilizzare il carattere " all'inizio e alla fine. Quindi, vorrei suggerire di modificare questa

ProcessStartInfo info = new ProcessStartInfo("cmd", @"/c " + Path.Combine(binDirectory, command)); 

a questo.

ProcessStartInfo info = new ProcessStartInfo("cmd", string.Format("/c \"{0}\"", Path.Combine(binDirectory, command))); 
0

tenta di aggiungere questa linea

info.Verb = "runas"; 
Problemi correlati