2008-10-29 5 views
10

J'essaie d'accéder à la ligne de commande et d'exécuter une commande, puis de renvoyer la sortie vers ma page ASPX. Un bon exemple serait d'exécuter dir sur le chargement de la page d'une page aspx et de retourner la sortie via Response.Write(). J'ai essayé d'utiliser le code ci-dessous. Lorsque j'essaie de déboguer cela, il s'exécute mais ne finit jamais le chargement et aucune sortie n'est rendue. J'utilise C# et .NET Framework 3.5sp1. Toute aide très appréciée.Exécution d'une ligne de commande à partir d'une page ASPX et renvoi de la sortie à la page

Merci, 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); 
    } 
} 

Répondre

9

Vous avez un problème avec la syntaxe des arguments de la ligne de commande pour cmd.exe. C'est pourquoi cmd ne sort jamais.
Pour que cmd.exe exécute un programme, puis quittez, vous devez lui envoyer la syntaxe "/ c [commande]". Essayez d'exécuter le même code avec la ligne

 si.StartInfo.Arguments = "dir"; 

remplacé par

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

et voir si cela fonctionne.

+0

Merci beaucoup! Fonctionne très bien. Je suis en train d'utiliser pour interagir avec w/perforce. – user32474

3

Très probablement votre problème est avec les autorisations. L'utilisateur sous lequel le processus ASP.NET s'exécute dispose de droits très limités. Par conséquent, vous devez définir les autorisations appropriées pour cet utilisateur ou exécuter ASP.NET sous un autre utilisateur. Cela cache cependant un risque de sécurité, vous devez donc faire très attention.

+1

Si les autorisations étaient le problème, le programme ne se bloquerait pas - cela provoquerait une exception. Ce qu'il dit, c'est que le programme se bloque et ne finit jamais de fonctionner. – configurator

0

C'est de la folie! Utilisez l'espace de noms System.IO pour créer votre liste de fichiers depuis votre programme C#! C'est très facile à faire. Bien que cette technique a également des problèmes d'autorisation.

+1

Je pense que c'était juste un exemple, pas vraiment l'utilisation prévue. –

+1

Cela m'a fait rire - perceptive! – pfeds

0

Utilisez System.Diagnostics.Process.

Voici quelques commandes de code ASP.NET pour exécuter des commandes subversion sur la ligne de commande.

/////////////////////////////////////////////////////////////////////// 
    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

C'est très similaire à ce qu'il a fourni dans son exemple ... – configurator

+0

Merci, je suis en train de faire quelque chose de similaire, en utilisant la ligne cmd pour exécuter des commandes contre perforce. – user32474

Questions connexes