从ASPX页面运行命令行,并将输出返回到页面

时间:2008-10-29 17:22:41

标签: c# asp.net

我正在尝试访问命令行并执行命令,然后将输出返回到我的aspx页面。一个很好的例子是在aspx页面的页面加载上运行dir并通过Response.Write()返回输出。我尝试过使用下面的代码。当我尝试调试它时,它会运行,但永远不会完成加载,也不会呈现输出。 我正在使用C#和.NET Framework 3.5sp1。任何帮助非常感谢。

谢谢, 布赖恩

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

4 个答案:

答案 0 :(得分:9)

cmd.exe的命令行参数的语法有问题。这就是为什么cmd永远不会退出的原因 为了让cmd.exe运行程序然后退出,你需要发送语法“/ c [command]”。尝试使用行

运行相同的代码
        si.StartInfo.Arguments = "dir";

替换为

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

看看它是否有效。

答案 1 :(得分:3)

很可能您的问题在于权限。运行ASP.NET进程的用户权限非常有限。

因此,您必须为该用户设置适当的权限,或者在其他用户下运行ASP.NET。

这隐藏了安全风险,所以你必须非常小心。

答案 2 :(得分:0)

这很疯狂!使用System.IO名称空间从C#程序中创建文件列表!这很容易做到;虽然这种技术也有授权问题。

答案 3 :(得分:0)

使用System.Diagnostics.Process。

这是一些shell代码,用于在命令行上运行subversion命令。

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