5

Używanie MSDN Mam klasę do napisania wrappera dla mojego narzędzia wiersza poleceń.Otoki dla narzędzia wiersza poleceń w języku C#

Mam teraz do czynienia z problemem, jeśli wykonanie exe za pomocą wiersza polecenia z argumentami, działa idealnie bez żadnych błędów.

Ale kiedy próbuję przekazać argumenty z opakowania, powoduje awarię programu.

Chciałem się dowiedzieć, czy poprawnie przekazuję argumenty, a jeśli się mylę, czy ktoś mógłby zwrócić na to uwagę? Jest to klasa LaunchEXE z 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;   

     } 
    } 
} 

ten sposób jestem przechodzącej argumenty z mojego programu głównego (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); 
     } 

Narzędzie wiersza poleceń akceptuje następujące polecenie i działa idealnie :

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

+0

Kiedy mówisz "zawiesza się program", otrzymujesz wyjątek, komunikat o błędzie, coś innego? – RQDQ

+0

Po prostu program się zawiesza, mam pliki dziennika dla tego narzędzia wiersza poleceń, ale nie jest on zbudowany przeze mnie ... Dostałem odpowiedź od twórcy tego narzędzia, że ​​to moja wina, a jego narzędzie działa dobrze. Ale to właśnie wydostałem z pliku dziennika narzędzia ... "System.NullReferenceException: Odwołanie do obiektu nie jest ustawione na instancję obiektu." jednak nie dostaję żadnego wyjątku błędu w moim programie ... –

+0

Punkt przerwania w newProcess.Start(); sam zawiesza program .. –

Odpowiedz

0

Mam przeczucie, że nie lubi przestrzeni na twojej ścieżce. Zobacz ten post: C# How to use Directory White Spaces into process.arguements?

+0

Też tak pomyślałem ... ale próbowałem użyć znaków ucieczki i nadal się nie udało. Plus próbowałem dowiedzieć się, czy miało to coś wspólnego z uprawnieniami. Ponieważ nawet wykonywanie cmd z parametrami nie działa, tylko wywoływanie cmd działa. Czy to może być problem z uprawnieniami?Jednak dziękuję za link @MatthewEvans –

+0

Mam system Windows 7 Home Premium i zainstalowany VS 2010 na nim. Czy muszę ustawić jakieś uprawnienia w VS, aby mieć prawa do folderów/plików w systemie. –

1

mam dwie opcje dla siebie -

1) Spróbuj prowadzenie Visual Studio na "Tryb administratora". lub 2) Spróbuj zaimplementować to zamiast tego. http://commandline.codeplex.com/.

"Biblioteka analizatora wiersza poleceń oferuje aplikacjom CLR czysty i zwięzły interfejs API do manipulowania argumentami wiersza poleceń i powiązanymi zadaniami, umożliwia wyświetlanie ekranu pomocy o wysokim stopniu dostosowywania i prosty sposób zgłaszania błędów składni Wszystko, co jest nudne i powtarzalne do zaprogramowania, opiera się na ramionach biblioteki, pozwalając ci skupić się na głównej logice, która zapewnia bezproblemowe analizowanie linii poleceń z ciągle aktualizowanym API od 2005 roku. "

Sprawdziło się doskonale dla mnie.

Powiązane problemy