5

Utilizzo di MSDN Ho ottenuto la classe per scrivere un wrapper per il mio strumento da riga di comando.Wrapper per uno strumento da riga di comando in C#

Ora sto affrontando un problema, se eseguo l'exe tramite la riga di comando con argomenti, funziona perfettamente senza errori.

Ma quando provo a passare gli argomenti dal Wrapper si blocca il programma.

Volevo sapere se sto passando gli argomenti correttamente e se ho torto, qualcuno potrebbe indicare per favore. Questa è la classe LaunchEXE da MSDN

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 

namespace SPDB 
{ 
    /// <summary> 
    /// Class to run any external command line tool with arguments 
    /// </summary> 
    public class LaunchEXE 
    { 
     internal static string Run(string exeName, string argsLine, int timeoutSeconds) 
     { 
      StreamReader outputStream = StreamReader.Null; 
      string output = ""; 
      bool success = false; 

      try 
      { 
       Process newProcess = new Process(); 
       newProcess.StartInfo.FileName = exeName; 
       newProcess.StartInfo.Arguments = argsLine; 
       newProcess.StartInfo.UseShellExecute = false; 
       newProcess.StartInfo.CreateNoWindow = true; //The command line is supressed to keep the process in the background 
       newProcess.StartInfo.RedirectStandardOutput = true; 
       newProcess.Start(); 
       if (0 == timeoutSeconds) 
       { 
        outputStream = newProcess.StandardOutput; 
        output = outputStream.ReadToEnd(); 
        newProcess.WaitForExit(); 
       } 
       else 
       { 
        success = newProcess.WaitForExit(timeoutSeconds * 1000); 

        if (success) 
        { 
         outputStream = newProcess.StandardOutput; 
         output = outputStream.ReadToEnd(); 
        } 
        else 
        { 
         output = "Timed out at " + timeoutSeconds + " seconds waiting for " + exeName + " to exit."; 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       throw (new Exception("An error occurred running " + exeName + ".", e)); 
      } 
      finally 
      { 
       outputStream.Close(); 
      } 

      return "\t" + output;   

     } 
    } 
} 

Questo è il modo in cui sto passando argomenti dal mio programma principale (Form1.cs)

private void button1_Click(object sender, EventArgs e) 
     { 
      string output; 
      output = LaunchEXE.Run(@"C:\Program Files (x86)\MyFolder\MyConsole.exe", "/BACKUP C:\\MyBackupProfile.txt", 100); 
      System.Windows.Forms.MessageBox.Show(output); 
     } 

Lo strumento da riga di comando accetta il seguente comando e funziona perfettamente :

C: \ Program Files (x86) \ MyFolder>MyConsole.exe/BACKUP C: \ MyBackupProfile.txt

+0

Quando si dice "arresta il programma", si ottiene un'eccezione, un messaggio di errore, qualcos'altro? – RQDQ

+0

Solo il programma si blocca, ho i file di registro per quello strumento da riga di comando, ma non è costruito da me ... Ho ricevuto una risposta dallo sviluppatore di quello strumento che è colpa mia e il suo strumento sta funzionando bene. Ma questo è quello che ho ottenuto dal file di registro dello strumento ... "System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto." tuttavia non ottengo alcun errore di eccezione nel mio programma ... –

+0

Un punto di interruzione su newProcess.Start(); si arresta in modo anomalo al programma .. –

risposta

0

Ho la sensazione che non gli piacciano gli spazi sul tuo cammino. Vedi questo post: C# How to use Directory White Spaces into process.arguements?

+0

L'ho pensato anch'io ... ma ho provato con i caratteri di escape e ancora non sono riuscito. Inoltre ho cercato di scoprire se era qualcosa a che fare con le autorizzazioni .. Come anche l'esecuzione di cmd con parametri non può essere eseguita, solo i lavori di richiamo di cmd. Può essere un problema con le autorizzazioni?Comunque grazie per il link @MatthewEvans –

+0

ho un Windows 7 Home Premium e installato VS 2010 su di esso. Devo impostare un qualche tipo di permesso in VS per avere i diritti su cartella/file sul sistema. –

1

Ho due opzioni per voi -

1) Si prega di provare a eseguire Visual Studio su "modalità amministratore". o 2) Provare a implementare questo invece. http://commandline.codeplex.com/.

"La libreria Parser della riga di comando offre alle applicazioni CLR un'API pulita e concisa per manipolare gli argomenti della riga di comando e attività correlate. Consente di visualizzare una schermata di guida con un elevato grado di personalizzazione e un modo semplice per segnalare errori di sintassi Tutto ciò che è noioso e ripetitivo da programmare si erge sulle spalle della biblioteca, permettendoti di concentrarti sulla logica di base: questa libreria fornisce un'analisi della riga di comando senza problemi con un'API costantemente aggiornata dal 2005. "

Ha funzionato benissimo per me.

Problemi correlati