Announcement

Collapse
No announcement yet.

command shell bằng c#

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C#] command shell bằng c#

    Em đang làm bài tập thực thi lệnh shell trong command line bằng c#, em làm theo hướng dẫn trên các 4rum và msdn, nhưng khi chạy thì có 1 số lệnh thì chạy được nhưng có 1 số lệnh không chạy, ví dụ như mở vào thư mục nào đó hoặc gõ lệnh exit để thoát thì nó không thoát, code của em như sau:
    PHP Code:
    static void Main(String[] args)
            {
                while (
    true)
                {
                    
    Console.WriteLine("Nhap lenh: ");
                    
    string cmd Console.ReadLine();
                    
    ProcessStartInfo info = new ProcessStartInfo(@"C:\WINDOWS\system32\cmd.exe""/Q /C " cmd);
                    
    info.CreateNoWindow false;
                    
    info.RedirectStandardOutput true;
                    
    info.UseShellExecute false;
                    
    info.RedirectStandardError true;
                    
    info.RedirectStandardError true;
                    
    info.WindowStyle ProcessWindowStyle.Hidden;

                    
    Process pro = new Process();
                    
    pro.StartInfo info;
                    
    String s "";
                    
    String t "";
                    
    pro.Start();

                    
    pro.StandardOutput.ReadToEnd();
                    
    pro.StandardError.ReadToEnd();

                    if(
    s!= null)
                    
    Console.WriteLine(s);
                    if (
    != nullConsole.WriteLine(t);
                    
    pro.WaitForExit();
                }
            } 
    và khi gõ 1 số lệnh sai thì em không biết làm sao để nó báo là lệnh sai, mong được các anh chi và các bạn giúp.
    :dreaming::sogood::go:h:

  • #2
    Mạn phép được trình bày một số điểm như sau:
    - Với cách làm như trên, cứ mỗi lần bạn muốn thực hiện một command, bạn phải tạo start một đối tượng process. Điều này cũng giống như mỗi khi thực hiện 1 command, bạn mở một cmd.exe lên và tắt đi, với command tiếp theo, bạn lại mở lại => Dễ dàng thấy được là lệnh cd lúc này sẽ không được lưu trữ lại (mặc dù bạn có cd nhưng khi tắt cmd đi và mở lại thì nó lại lấy đường dẫn hiện hành).
    - Cách giải quyết ở đây là tìm một hướng giải quyết khác (mình cũng chưa biết là hướng nào ^^) hoặc vẫn làm theo hướng này và viết lại cái cd của riêng bạn. Mình chọn hướng thứ hai và đã implement như code bên dưới.
    - Nhưng cái cd mình viết lại nó hơi khác so với cái cd trong cmd.exe, cụ thể như thế nào thì bạn so sánh thử xem, nhưng vẫn đảm bảo là nó sẽ change directory (change ngay và luôn - đây là một cái khác biệt quan trọng). Cái đường dẫn này sẽ được set cho WorkingDirectory của info.
    - Và vẫn vì lý do "1 command - 1 cmd.exe" nên cái lệnh exit gần như là không có ý nghĩa gì hết ráo (thực hiện xong lệnh là nó exit!). Mặt khác chương trình mình chỉ là interface gửi command xuống cho cmd.exe xử lý nên nó không có tác động trên console chương trình. Cái này đơn giản thì mình kiểm tra xem thằng command đưa xuống có phải là exit không, nếu là exit thì out thôi, cũng coi như là viết lại thằng exit vậy ^^.
    - Bạn có biến t để lưu trữ message về error đó => nếu có lỗi thì t != "", còn gặp trường hợp lỗi mà nó không có thông báo thì mình chịu (mà trường hợp này mình chưa thấy). Thay vì in ra cái t này thì mình in ra là "Lenh sai".
    - Biến s và t có nhất thiết phải != null ???, hình như nó chỉ "" hay !"" mà thôi, bạn thử kiểm tra lại xem. Trong code mình vẫn để kiểm tra null cho chắc.

    Code:
    static void Main(string[] args)
            {
                string cmd = "";
                ProcessStartInfo info = new ProcessStartInfo();
                info.CreateNoWindow = false;
                info.RedirectStandardOutput = true;
                info.UseShellExecute = false;
                info.RedirectStandardError = true;
                info.RedirectStandardError = true;
                info.WindowStyle = ProcessWindowStyle.Hidden;
                info.FileName = "cmd";
                Process pro = new Process();
                String s = "";
                String t = "";
                String wd = @"C:\\users";
                while ("exit" != cmd)
                {
                    Console.WriteLine("Nhap lenh: ");
                    cmd = Console.ReadLine();
                    info.Arguments = "/Q /C " + cmd;
                    info.WorkingDirectory = wd;
                    pro.StartInfo = info;
                    pro.Start();
                    s = pro.StandardOutput.ReadToEnd();
                    t = pro.StandardError.ReadToEnd();
                    if (!cmd.StartsWith("cd ") && s != null && s != "")
                        Console.WriteLine(s.Trim());
                    if (t != null && t != "")
                        Console.WriteLine("Lenh sai");
                    if (cmd.StartsWith("cd ") && t == "")
                    {
                        string sdir = cmd.Split(' ')[1];
                        if (sdir == "..")
                        {
                            try
                            {
                                wd = Directory.GetParent(wd).FullName;
                            }
                            catch (NullReferenceException)
                            {
                                Console.WriteLine("Duong dan khong hop le");
                            }
                        }
                        else
                        {
                            if (Directory.Exists(sdir))
                            {
                                wd = sdir;
                            }
                            else if (Directory.Exists(wd + "\\" + sdir))
                            {
                                wd += "\\" + sdir;
                            }
                        }
                    }
                    Console.WriteLine("");
                    pro.WaitForExit();
                }
                pro.Close();
            }

    Comment


    • #3
      Em cảm ơn anh, với cách làm như trên thì hình như mình hơi làm nhiều về cái cd, nếu như đề bài yêu cầu chung là thực thi các câu lệnh như của commandline của windows thì hướng này làm có đúng không anh.
      :dreaming::sogood::go:h:

      Comment


      • #4
        Theo mình nghĩ thì các lệnh nối tiếp nhau nó sẽ không thực hiện được, như cd, telnet,... Vì nó không lưu lại trạng thái trước đó mà. Còn các lệnh đơn thì được thôi bạn ^^

        Comment


        • #5
          Originally posted by 08520021 View Post
          Theo mình nghĩ thì các lệnh nối tiếp nhau nó sẽ không thực hiện được, như cd, telnet,... Vì nó không lưu lại trạng thái trước đó mà. Còn các lệnh đơn thì được thôi bạn ^^
          cái code anh bổ sung cho em, em kiểm tra lại thì thấy biến s và t chỉ cần kiểm tra nó khác "" hay không chứ không có null tại vì lúc đầu em set biến s và t = "" rùi hì :shy: em có thấy trên các 4rum nước ngoài có nói đến tạo file .bat để lưu các lệnh mình đã thực hiện để thực hiện các lệnh thực thi sau, mà em chưa biết làm cái này ra sao, anh có thể hướng dẫn em được không, em cảm ơn
          Last edited by 10520388; 19-12-2012, 10:20.
          :dreaming::sogood::go:h:

          Comment


          • #6
            Hi hi, cái này mình chịu rồi bạn à ^^. Đi làm cả ngày nên cũng không có time tìm hiểu.
            Hi vọng bạn sớm có lời giải cho bài nào, lúc nào rảnh mình cũng sẽ cố xem thử, biết đâu lúc đó nhờ bạn chỉ :sexy:

            Comment


            • #7
              em cảm ơn a đã hướng dẫn, em có xem sơ về cái file .bat rùi, muk cũng sắp nộp bài rùi nên chắc em làm đơn giản thui, có thời gian sẽ xem thêm, thanks a :sogood:
              :dreaming::sogood::go:h:

              Comment

              LHQC

              Collapse
              Working...
              X