NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (윈도우 커멘드라인 액션 만들기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 매크로 프로그램에서 아무리 많은 기능을 제공한다 하더라도 윈도우의 기본 커멘드라인을 대체할 수 없습니다. 윈도우 커멘드라인과 윈도우 쉘을 사용하면 안되는게 없을정도로 막강한 기능들을 제공하고 있기 때문입니다. 또한, 배치파일을 이용해서 어느정도 단순한 매크로 프로세스를 만들수도 있어요. 구글 크롬이나 엣지처럼 커멘드라인 명령어를 제공하는 프로그램들은 배치파일과 같이 사용하면 막강한 성능을 낼 수도 있습니다.

     

    커멘드라인이 막강한 기능을 가지고 있지만, 전통적인 검은 화면에 명령을 타이핑해서 입력해야 하므로 개발자가 아닌 경우 사용하기가 어려울 수 있습니다. 그래서, 엔지엠 매크로와 같은 GUI 클라이언트를 사용합니다. 엑셀이나 한글과 같은 오피스 관련 프로그램을 사용하시는 분들은 공감하실듯 한데요. GUI가 없는 프로그램에서 텍스트를 디자인하거나 표를 만들기는 어렵습니다.

     

    윈도우 커멘드라인을 매크로 프로그램에서 사용할 수 있다면 훨씬 더 효율적인 업무 자동화가 가능해집니다. 아무래도 이미 잘 만들어진 명령들을 이미지 분석이 가능한 매크로 프로그램과 같이 사용하면 비즈니스 로직이 풍부해지기 때문입니다. 자~ 이제 모델을 만들어 볼까요? 아래는 필수적인 옵션은 아니지만, 닷넷에서 제공하는 프로세스가 요구하는 기본 속성들입니다.

        public class CommandModel : BaseModel
        {
            [XmlIgnore]
            [LocalizedCategory("Data")]
            [LocalizedDisplayName("Result")]
            [LocalizedDescription("Result")]
            [Browsable(true)]
            [DefaultValue(null)]
            [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
            public string? Result { get; set; }
    
            [XmlIgnore]
            [LocalizedCategory("Data")]
            [LocalizedDisplayName("ProcessId")]
            [LocalizedDescription("ProcessId")]
            [Browsable(true)]
            [ReadOnly(true)]
            [DefaultValue(null)]
            [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
            public string? ProcessId { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("ProcessName")]
            [LocalizedDescription("ProcessName")]
            [Browsable(true)]
            [DefaultValue(null)]
            [EditorAttribute(typeof(MultilineStringEditor), typeof(UITypeEditor))]
            public string? ProcessName { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("Arguments")]
            [LocalizedDescription("Arguments")]
            [Browsable(true)]
            [DefaultValue(null)]
            [EditorAttribute(typeof(MultilineStringEditor), typeof(UITypeEditor))]
            public string? Arguments { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("WindowStyle")]
            [LocalizedDescription("WindowStyle")]
            [Browsable(true)]
            [DefaultValue(typeof(ProcessWindowStyle), "Normal")]
            public ProcessWindowStyle WindowStyle { get; set; } = ProcessWindowStyle.Normal;
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("CreateNoWindow")]
            [LocalizedDescription("CreateNoWindow")]
            [Browsable(true)]
            [DefaultValue(false)]
            public bool CreateNoWindow { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("ErrorDialog")]
            [LocalizedDescription("ErrorDialog")]
            [Browsable(true)]
            [DefaultValue(false)]
            public bool ErrorDialog { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("UseShellExecute")]
            [LocalizedDescription("UseShellExecute")]
            [Browsable(true)]
            [DefaultValue(false)]
            public bool UseShellExecute { get; set; }
    
            [LocalizedCategory("Action")]
            [LocalizedDisplayName("WorkingDirectory")]
            [LocalizedDescription("WorkingDirectory")]
            [Browsable(true)]
            [DefaultValue(null)]
            public string? WorkingDirectory { get; set; }

     

    지금까지 만들었던 액션들중에서 속성이 가장 많은거 같습니다. 각각의 속성이 하는 역할은 아래와 같습니다.

    • ProcessName: 윈도우의 커멘드 라인에서 사용할 프로세스 이름을 입력하세요. ex) cmd.exe, chrome.exe
    • Arguments: 프로세스에 커멘드 라인으로 처리할 수 있는 옵션을 입력하세요.
    • WindowStyle: 시스템 프로세스를 시작 하는 경우 새 창이 표시 되는 방식을 지정 합니다.
    • CreateNoWindow: 프로세스를 포함할 새 창을 만들지 않고 프로세스를 시작해야 하면 true이고, 그러지 않으면 false 입니다.기본값은 false입니다.
    • ErrorDialog: 프로세스를 시작할 수 없는 경우 화면에 오류 대화 상자를 표시하려면 true이고, 그러지 않으면 false입니다.기본값은 false입니다.
    • UseShellExecute: 프로세스를 시작할 때 쉘을 사용하려면 true이고, 실행 파일에서 직접 프로세스를 만들어야 하면 false입니다.기본값은 true입니다.
    • WorkingDirectory: 쉘 사용 속성이 false인 경우 시작할 프로세스의 작업 디렉터리를 가져오거나 설정합니다.
      쉘 사용이 true인 경우 시작할 프로세스가 포함된 디렉터리를 가져오거나 설정합니다.

     

    개발자가 아닌 경우 옵션의 설명을 봐도 잘 이해가 안갈수도 있습니다. 그럴때는 하나씩 옵션을 바꿔가면서 테스트해보면서 어떤 것들이 변화하는지 살펴보면 됩니다. 이제, 프로세스를 생성하고 옵션들을 어떻게 적용하는지 코드를 보면서 알아볼까요?

     

    일단 아래와 같이 프로세스 지역 변수를 하나 만들고, nullable로 선언해줍니다. 프로세스도 idisposable 인터페이스를 구현하고 있기 때문에 해당 프로세스 사용이 완료되면 메모리에서 해제할 수 있도록 dispose 메소드를 호출해줘야 합니다.

    Process? proc = null;

     

    윈도우 커멘드라인을 작성하는건 사용자가 마음대로 할 수 있기 때문에 개발자가 예상하지 못한 에러가 발생할 확률이 큽니다. 이런 경우에는 try ~ catch ~ finally를 사용해서 에러를 캐치하고, 에러가 발생했을 때 메모리 해제등등... 후처리 로직을 추가해야 합니다.

     

    아래 코드의 내용이 복잡해 보이긴 하지만, 사실 간단한 내용들뿐입니다. 닷넷에서 제공하는 프로세스의 속성을 엔지엠 매크로 액션으로 사용자가 설정한 값을 그대로 복사하는 방식입니다. 따라서, 이런저런 조건들로 사용자가 값을 설정했는지만 체크하고 있습니다. 설정 값이 있으면 프로세스의 정보에 넣어줍니다.

    ProcessStartInfo processInfo = new ProcessStartInfo();
    
    processInfo.FileName = ProcessName;
    
    if (!string.IsNullOrEmpty(Arguments))
        processInfo.Arguments = Arguments;
    
    if (!string.IsNullOrEmpty(WorkingDirectory))
        processInfo.WorkingDirectory = WorkingDirectory;
    
    processInfo.UseShellExecute = UseShellExecute;
    processInfo.ErrorDialog = ErrorDialog;
    processInfo.CreateNoWindow = CreateNoWindow;
    processInfo.WindowStyle = WindowStyle;
    
    if (!UseShellExecute)
        processInfo.RedirectStandardOutput = true;
    
    proc = Process.Start(processInfo);
    
    if (proc != null && !UseShellExecute)
    {
        ProcessId = proc.Id.ToString();
    
        while (!proc.StandardOutput.EndOfStream)
        {
            string? result = proc.StandardOutput.ReadLine();
    
            if (!string.IsNullOrEmpty(result))
                Result += (result + Environment.NewLine);
        }
    
        Result = Result?.TrimEnd(Environment.NewLine.ToCharArray());
    }

     

    여기까지가 코드 작성 끝입니다. 이제 테스트를 해볼까요? 크롬 웹브라우저를 실행하고, 엔지엠소프트웨어 홈페이지로 이동하도록 해보겠습니다.

    • 프로세스 이름: http://ngmsoftware.com
    • 인수 목록: C:\Program Files\Google\Chrome\Application\chrome.exe

    gHI9MTp.png

     

     

    매크로를 실행하면 구글 크롬 웹브라우저가 실행되고, 엔지엠소프트웨어 홈페이지로 연결됩니다.

     

     

    잘 작동하는군요. 이외에도 메모장이나 계산기 또는 그림판과 같은 것들도 쉽고 빠르게 실행할 수 있습니다. 특히나 윈도우의 설정들을 변경할 수 있는 쉘을 사용하면 윈도우의 보안이나 캐시, 로그, 서버등등... 많은 것들을 자동으로 처리할 수 있습니다. 자주 사용하는 윈도우 기능인 파일 복사, 폴더 이동등등도 가능합니다. 물론, 엔지엠 매크로에서 제공해주는 액션들을 사용하는게 더 직관적이긴 합니다^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.