안녕하세요. 명월입니다.
이 글은 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 클래스)에 대한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Development note > C#' 카테고리의 다른 글
[C#] Selenium을 사용하는 방법 (1) | 2020.05.29 |
---|---|
[C#] Window Form을 생성하지 않고 Window Control를 사용하는 방법 (0) | 2020.05.18 |
[C#] FTP에 접속해서 파일 다운로드, 업로드하는 방법 (0) | 2020.02.14 |
[C#] Soap 통신 서버를 만드는 방법(C#, Java, Php, Python으로 접속) (0) | 2020.02.11 |
[C#] Python을 사용하기 위한 방법(pythonnet) (2) | 2020.02.07 |
[C#] 비동기 소켓 통신(IOCP) - APM 패턴 (0) | 2020.02.02 |
[C#] 비동기 소켓 통신(IOCP) - EAP 패턴 (36) | 2020.01.31 |
[C#] MVC Framework에서 WebSocket을 사용하는 방법(SignalR) (0) | 2019.11.29 |