[C#] Command(cmd) 명령어 실행하는 방법(Process 클래스)


Development note/C#  2020. 2. 11. 01:09

안녕하세요. 명월입니다.


이 글은 C#에서 Command(cmd) 명령어 실행하는 방법(Process 클래스)에 대한 글입니다.


C#프로그램은 Window 환경에서 구축하는 것이 보통입니다. Core가 있어 Linux환경이나 IOT환경에서도 개발을 하여 사용할 수 있지만, 수요가 그렇게 많지 않습니다. 그래서 .Net framework에서 Process 클래스를 이용하면 Window Command를 조작하는 프로그램을 개발할 수 있습니다.

using System;
using System.Diagnostics;
namespace ProcessExample
{
  // Process 클래스를 상속받는다.
  class Program : Process
  {
    // 생성자
    public Program()
    {
      // Process 환경 설정 클래스
      ProcessStartInfo startInfo = new ProcessStartInfo();
      // 실행할 프로그램 명
      startInfo.FileName = "CMD.exe";
      // 셀 배치 설정 = false
      startInfo.UseShellExecute = false;
      // 입력 Stream 사용 여부
      startInfo.RedirectStandardInput = true;
      // 출력 Stream 사용 여부
      startInfo.RedirectStandardOutput = true;
      // 에러 Stream 사용 여부
      startInfo.RedirectStandardError = true;
      // Process 종료시(Close 함수 호출시) 이벤트 발생 여부
      base.EnableRaisingEvents = false;
      // Process 클래스에 환경 설정
      base.StartInfo = startInfo;
      // 실행 함수 호출
      Executor();
    }

    public void Executor()
    {
      // 작업 시작 디렉토리
      base.StartInfo.WorkingDirectory = @"D:\";
      // 콘솔 화면에 표시
      Console.Write(base.StartInfo.WorkingDirectory + ">");
      // exit 명령어가 올 때까지 무한 루프
      while (true)
      {
        // 콘솔로부터 명령어를 입력 받는다.
        string cmd = Console.ReadLine();
        // exit 명령어가 입력시에 종료한다.
        if ("exit".Equals(cmd.Trim(),StringComparison.OrdinalIgnoreCase))
        {
          break;
        }
        try
        {
          // Process 시작 (cmd.exe 실행)
          base.Start();
          // 입력 스트림.
          using (base.StandardInput)
          {
            // cmd.exe 실행 후 명령어 입력
            base.StandardInput.Write(cmd + Environment.NewLine);
          }
          // 에러 스트림
          using (base.StandardError)
          {
            var ret = base.StandardError.ReadToEnd();
            if (!String.IsNullOrWhiteSpace(ret))
            {
              Console.WriteLine(ret);
            }
          }
          // 출력 스트림
          using (base.StandardOutput)
          {
            // cmd.exe로 받은 출력을 ret 변수에 담는다.
            var ret = base.StandardOutput.ReadToEnd();
            // 개행 추가
            cmd += "\r\n";
            // 출력 스트림에 입력 값도 포함되어 있기 때문에 제거한다.
            Console.Write(ret.Substring(ret.IndexOf(cmd) + cmd.Length));
            // cmd.exe 명령어는 항상 명령어가 끝나면 디렉토리가 나온다. 최종 디렉토리를 추출한다.
            String buffer = ret.Substring(ret.LastIndexOf("\r\n\r\n") + 4);
            // 최종 디렉토리를 WorkDirectory 설정
            base.StartInfo.WorkingDirectory = buffer.Substring(0, buffer.Length - 1);
          }   
        }
        catch (Exception e)
        {
          // 에러 발생 시 디렉토리 재 설정
          base.StartInfo.WorkingDirectory = @"C:\";
          Console.WriteLine(e);
        }
        finally
        {
          // cmd.exe 종료
          base.Close();
        }
      }
    }
    static void Main(string[] args)
    {
      // 프로그램 실행
      new Program();
      // 콘솔 대기.
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}

위 결과를 보면 처음 D드라이브로 콘솔이 시작됩니다. 마치 cmd 창처럼 커서가 d:> 뒤쪽에 표시 되네요.

그리고 디렉토리를 변경 시에 드라이브 d:\디렉토리> 표시도 잘됩니다. 최종 dir 명령어를 실행시켜 파일 리스트를 받아서 표시했습니다.

마지막에 exit를 쳐서 Process 프로그램을 종료합니다.


참고로 위 예제는 cmd.exe가 아니고, cmd.exe와 최대한 비슷한 UI로 프로그램을 만들었습니다. 거의 똑같네요.....


여기까지 C#에서 Command(cmd) 명령어 실행하는 방법(Process 클래스)에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.