2008-10-29 12 views
10

Próbuję uzyskać dostęp do wiersza polecenia i wykonać polecenie, a następnie zwrócić dane wyjściowe do mojej strony aspx. Dobrym przykładem może być uruchomienie katalogu na stronie strony aspx i zwrócenie danych wyjściowych przez Response.Write(). Próbowałem użyć poniższy kod. Kiedy próbuję debugowania to działa, ale nigdy nie kończy się ładowanie i żadne dane wyjściowe nie są renderowane. Korzystam z C# i .NET Framework 3.5sp1. Każda pomoc doceniona.Uruchamianie wiersza polecenia ze strony ASPX i zwracanie danych wyjściowych do strony

Dzięki, Bryan

public partial class CommandLine : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     System.Diagnostics.Process si = new System.Diagnostics.Process(); 
     si.StartInfo.WorkingDirectory = @"c:\"; 
     si.StartInfo.UseShellExecute = false; 
     si.StartInfo.FileName = "cmd.exe"; 
     si.StartInfo.Arguments = "dir"; 
     si.StartInfo.CreateNoWindow = true; 
     si.StartInfo.RedirectStandardInput = true; 
     si.StartInfo.RedirectStandardOutput = true; 
     si.StartInfo.RedirectStandardError = true; 
     si.Start(); 
     string output = si.StandardOutput.ReadToEnd(); 
     si.Close(); 
     Response.Write(output); 
    } 
} 

Odpowiedz

9

Masz problem ze składnią argumentów linii poleceń do polecenia cmd.exe. Dlatego cmd nigdy nie wychodzi.
Aby program cmd.exe uruchomił program, a następnie zamknij, musisz wysłać mu składnię "/ c [polecenie]". Spróbuj uruchomić tego samego kodu z linii

 si.StartInfo.Arguments = "dir"; 

zastąpione

 si.StartInfo.Arguments = "/c dir"; 

i sprawdzić, czy to działa.

+0

Wielkie dzięki! Działa świetnie. Używam do interakcji w/perforce. – user32474

3

Najprawdopodobniej problem jest z uprawnieniami. Użytkownik, na którym działa proces ASP.NET ma bardzo ograniczone prawa.

Tak więc musisz ustawić odpowiednie uprawnienia dla tego użytkownika lub uruchomić ASP.NET pod jakimś innym użytkownikiem.

To jednak powoduje zagrożenie bezpieczeństwa, więc musisz być bardzo ostrożny.

+1

Jeśli uprawnienia były problemem, program nie zawiesił się - spowodowałby wyjątek. Mówi tylko, że program się zawiesza i nigdy się nie kończy. – configurator

0

To szaleństwo! Użyj namepace System.IO, aby utworzyć listę plików z poziomu programu C#! To bardzo łatwe do zrobienia; chociaż ta technika ma również problemy z autoryzacją.

+1

Myślę, że to był tylko przykład, a nie zamierzone użycie. –

+1

To mnie rozśmieszyło - spostrzegawczość! – pfeds

0

Użyj System.Diagnostics.Process.

Oto niektóre kody ASP.NET, które mogą uruchamiać komendy subversion w wierszu poleceń.

/////////////////////////////////////////////////////////////////////// 
    public static string run_svn(string args_without_password, string svn_username, string svn_password) 
    { 
     // run "svn.exe" and capture its output 

     System.Diagnostics.Process p = new System.Diagnostics.Process(); 
     string svn_path = Util.get_setting("SubversionPathToSvn", "svn"); 
     p.StartInfo.FileName = svn_path; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 

     args_without_password += " --non-interactive"; 
     Util.write_to_log ("Subversion command:" + svn_path + " " + args_without_password); 

     string args_with_password = args_without_password; 

     if (svn_username != "") 
     { 
      args_with_password += " --username "; 
      args_with_password += svn_username; 
      args_with_password += " --password "; 
      args_with_password += svn_password; 
     } 

     p.StartInfo.Arguments = args_with_password; 
     p.Start(); 
     string stdout = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 
     stdout += p.StandardOutput.ReadToEnd(); 

     string error = p.StandardError.ReadToEnd(); 

     if (error != "") 
     { 
      Util.write_to_log(error); 
      Util.write_to_log(stdout); 
     } 

     if (error != "") 
     { 
      string msg = "ERROR:"; 
      msg += "<div style='color:red; font-weight: bold; font-size: 10pt;'>"; 
      msg += "<br>Error executing svn.exe command from web server."; 
      msg += "<br>" + error; 
      msg += "<br>Arguments passed to svn.exe (except user/password):" + args_without_password; 
      if (error.Contains("File not found")) 
      { 
       msg += "<br><br>***** Has this file been deleted or renamed? See the following links:"; 
       msg += "<br><a href=http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html>http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html</a>"; 
       msg += "<br><a href=http://subversion.open.collab.net/articles/best-practices.html>http://subversion.open.collab.net/articles/best-practices.html</a>"; 
       msg += "</div>"; 
      } 
      return msg; 
     } 
     else 
     { 
      return stdout; 
     } 
    } 
+0

Jest to bardzo podobne do tego, które podał w swoim przykładzie ... – configurator

+0

Dzięki, robię coś podobnego, używając linii poleceń cmd do uruchamiania poleceń przeciwko perforce. – user32474

Powiązane problemy