Eseguire da linea di comando utilizzando C#

Tutti sto cercando di fare è inviare un comando che apre un modello con il program.exe
Dovrebbe essere super semplice!

Ex:

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

La riga sopra funziona bene se incollato nella finestra del prompt dei comandi.
Tuttavia, quando si tenta di passare la stessa stringa esatta sul mio codice si ottiene bloccato su C:\Program

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

string ExeModel = EXE + " " + Model;

MessageBox.Show(ExeModel);

ExecuteCommand(ExeModel);

ExeModel sta mostrando te seguente linea di Visual Studio:

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

A me sembra che è la stringa che ho bisogno di inviare il seguente metodo:

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;
}

Cose che ho sempre cercato:

  1. Passare un solo comando alla volta (funziona come previsto), ma non è un opzione in quanto il modello di file si apre con un’altra versione del software.
  2. Ho cercato di Tagliare
  3. Provato con @ con \”

Chiunque può vedere un’evidente errore? Grazie.

  • Perché stai usando cmd.exe /K ..., invece di semplicemente chiamando il programma direttamente? Che permetterebbe di evitare il fastidio di dover fuggire spazi…
  • Sì, l’uso del Processo.Iniziare a richiamare l’effettivo EXE che si desidera. Per evitare qualsiasi problema si può avere dove si sarebbe altrimenti necessario “doppia fuga” caratteri speciali.
  • Un hassel esiste in entrambi i modi. Devi fuggire la stringa di comando da passare come argomento cmd.exe o è necessario analizzare il comando originale per separare il nome del file da argomenti per passarli al Processo.Start, che richiede loro di essere passato separatamente. Se si avvia con loro separati, è facile. Tuttavia, se si è dato un singolo comando stringa con il nome del file e gli argomenti in esso, è discutibile meno complicate per sfuggire alla stringa e passare a cmd.exe piuttosto che cercare di separare il nome del file da argomenti controllando citato nomi o spazi.
InformationsquelleAutor MicroSumol | 2011-03-03

 

2 Replies
  1. 3

    Perché aprire un prompt dei comandi (cmd.exe)? Basta passare il nome del file eseguibile.

    • Nonostante il fatto che NativeMethods.CreateProcess prende l’intera riga di comando come una singola stringa, Processo.Iniziare è necessario innanzitutto analizzare una riga di comando per separare il nome del file dall’argomenti, solo per il Processo.StartWithCreateProcess per ricombinarle in una singola stringa attraverso il Processo.BuildCommandLine metodo. Il quadro pedine questo compito in più di sconto su di noi, perché ha bisogno di loro separati per ShellExecuteInfo quando il processo di esecuzione flag è impostato, in modo che il facile compito di coniugare filename+argomenti, e ci lascia fare il lavoro sporco di analisi il file nome. Bello 😛
    • Il mio punto è… un modo o nell’altro, si sta andando ad avere per passare attraverso alcuni problemi per ottenere un comando arbitrario per l’esecuzione. Si sta andando ad avere per sfuggire al comando per passare a cmd.exe o si sta andando ad analizzare il comando per separare i (eseguibile) nome del file da argomenti di passare al Processo.Start. È probabilmente meno complicato (dato un input dell’utente stringa della riga di comando) per sfuggire l’intera stringa e la passa al cmd.exe piuttosto che tentare di isolare il nome del file da argomentazioni, in quanto il nome del file potrebbe essere racchiuso tra apici o può contenere spazi, etc.
  2. 6

    È abbastanza semplice. Basta creare una riga di comando oggetto, quindi, la scrittura, quindi per eseguirlo di lettura, con 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;
    }
    • Si chiama così semplice?
    • Certo, è semplice, basta copiare e incollare… 😉 scherzi a parte, non troppo male. Tutti i comandi sono solo di installazione per preferenza personale. Quindi, in realtà ci sono solo una manciata di comandi che sono effettivamente necessari. Bene, crea un livello di programmazione della riga di comando.

Lascia un commento