본문 바로가기
개발언어/C#.NET

C# 코드로 Dos 명령 실행하기!

by 엔돌슨 2012. 11. 4.
반응형

C# 코드로 Dos 명령 실행하기!


 

날씨가 무척이나 덥습니다. 사무실은 다행히 적당히 시원하지만, 잠시 밖에 나간다 하면 윽! 하는 소리가 절로 나오네요~. 말복이 지나고 입추가 지났는데도 이렇게 더운 건 정말 날씨가 미친 걸까요? 개인적으로 가을을 많이 좋아하는데요~ 이럴 때일수록, 좋아라 하는 가을이 한시라도 빨리 왔으면 하는 바램이 굴뚝같습니다.


이번에는
 C#코드로 Dos 명령을 실행하는 코드를 살펴보겠습니다. 윈도우에서 실행창(Ctrl+R)을 통해 명령을 처리하거나, CMD 창을 이용해 처리하는 명령을 C#코드를 이용해서 사용하는 방법에 대해 간략히 소개해 드리도록 하겠습니다.

 

Process & ProcessStartInfo

.Net Framework는 정말 많은 API를 제공합니다. 그 중에서 우리가 이번에 사용하게 될 객체는 바로 System.Diagnostics 네임스페이스 아래 있는 Process와 ProcessStartInfo 클래스입니다. Process 클래스는 ProcessStartInfo 클래스에할당 된 실행 정보를 이용해 새로운 Process를 윈도우에 생성하고 이 ProcessStartInfo는 Process 클래스가 실행해야 하는 실행 파일명과 기타 정보들을 담고 있는 클래스입니다.

그럼 이 클래스를 이용해서, 응용프로그램 파일을 실행하는 코드를 보겠습니다.

ListViewItem lvi1 = new ListViewItem(new string[]{"Paint", "mspaint"});

ListViewItem lvi2 = new ListViewItem(new string[]{"계산기", "calc"});

ListViewItem lvi3 = new ListViewItem(new string[]{"NotePad", "notepad"});

ListViewItem lvi4 = new ListViewItem(new string[]{"MS Office Word", "winword", @"D:\Documents\sample.doc"});

ListViewItem lvi5 = new ListViewItem(new string[]{"MS Office Excel", "excel"});

ListViewItem lvi6 = new ListViewItem(new string[]{"SQL 쿼리분석기", "isqlw"});

ListViewItem lvi7 = new ListViewItem(new string[]{"Internet Explorer", "iexplore", "http://zmeun.tistory.com"});

                               

this.lvPrograms.View = View.Details;

this.lvPrograms.Columns.Add("Program Name", 180, HorizontalAlignment.Center);

                               

this.lvPrograms.Items.Add(lvi1);

this.lvPrograms.Items.Add(lvi2);

this.lvPrograms.Items.Add(lvi3);

this.lvPrograms.Items.Add(lvi4);

this.lvPrograms.Items.Add(lvi5);

this.lvPrograms.Items.Add(lvi6);

this.lvPrograms.Items.Add(lvi7);

[코드 1 실행 할 응용프로그램 파일 목록]

 

위 코드는 ListView 컨트롤에 실행시킬 응용프로그램 파일 목록을 담는 코드입니다. 코드에 담겨진 응용프로그램 목록은 윈도우에서 제공하는 그림판과 계산기, 메모장과 Internet Explorer이고, MS Office에 있는 MS Word와 Excel 그리고 MS-SQL Server에 있는 쿼리 분석기입니다. (나름 흔히 사용하는 파일들을 예제로 넣어 두었습니다.) 이렇게추가된 코드는 아래와 같이 나타납니다.

사용자 삽입 이미지
[그림 1 실행 프로그램 목록]

 

저렇게 나타난 목록 중에 맘에 드는 것을 선택 후 Execute Selected Program 버튼을 클릭하면, CLR은 윈도우에 새로운 프로세스를 만들고 그 안에서 선택한 프로그램을 실행시키게 됩니다. 아래 코드는 목록에 있는 프로그램을 선택후 버튼을 클릭하면 실행되는 코드입니다.

string command = this.lvPrograms.SelectedItems[0].SubItems[1].Text;

string args = "";

if(this.lvPrograms.SelectedItems[0].SubItems.Count > 2)

{

   args = this.lvPrograms.SelectedItems[0].SubItems[2].Text;

}

 

System.Diagnostics.Process process = new System.Diagnostics.Process();

process.EnableRaisingEvents = false;

process.StartInfo.FileName = command;

process.StartInfo.Arguments = args;

 

process.Start();

[코드 2 실행 코드]

 

위에서 보셨던, 목록에 실행시킬 프로그램을 추가하는 코드는, 실제 프로그램 명뿐만 안니라, 실행파일명과 실행 시에 할당 할 Arguments 값까지 가지고 있습니다. 이 Arguments는  MS Word와 Internet Explorer 두 군데 할당되어 있는데, MS Word에 할당 된 인자는 열 문서를 지정한 경로값이고, Internet Explorer에 할당된 인자는 열어 볼 Page Url입니다.

사용자 삽입 이미지
[그림 2 계산기 실행 결과]


사용자 삽입 이미지

[그림 3 IE 실행 결과]

 

목록에 있는 프로그램 중 계산기와 Ineternet Explorer를 실행 시켜 본 모습입니다. Internet Explorer에는 http://zmeun.tistory.com 경로를 ProcessStartInfo 클래스의 Arguments로 할당하였고, 실행 프로그램 명을 IExplorer로 주었습니다. 그래서 IE가 실행 할 때 Arguments에 할당 된 url 주소를 바로 열리게 되는 것입니다.

 

Execute Dos Command

그럼 이번에는 실제로 Dos 명령을 실행하는 코드를 알아보겠습니다. 역시 이번에도 사용될 클래스는 위에서 말씀드린 Process와 ProcessStartInfo 이 두 개의 클래스 입니다.

System.Diagnostics.Process process = new System.Diagnostics.Process();

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();

startInfo.FileName = "CMD.exe";

startInfo.WorkingDirectory = @"D:\";

 

startInfo.UseShellExecute = false;

startInfo.RedirectStandardInput = true;

startInfo.RedirectStandardOutput = true;

startInfo.RedirectStandardError = true;

 

process.EnableRaisingEvents = false;   

process.StartInfo = startInfo;

process.Start();

process.StandardInput.Write(this.txtCommand.Text + Environment.NewLine);

process.StandardInput.Close();

 

string result = process.StandardOutput.ReadToEnd();

string error = process.StandardError.ReadToEnd();

System.Text.StringBuilder sb = new System.Text.StringBuilder();

sb.Append("[ Result Info ]\r\n");

sb.Append(result);

sb.Append("\r\n");

sb.Append("[ Error Info ]\r\n");

sb.Append(error);

 

 

this.txtResult.Text = sb.ToString();

 

process.WaitForExit();

process.Close();

[코드 3 Dos 명령 실행 코드]

 

Dos 명령을 실행시키기 위해서 ProcessStartInfo 클래스의 FileName 속성에 실행 할 파일명을 “CMD.exe”로 주고, WorkingDirectory는 “D:\”로 설정합니다. 그리고 중요한 부분인데, ProcessStartInfo 클래스의 RedirectStandardInput와 RedirectStandardOutput 그리고 RedirectStandError 속성을 모두 true로 설정합니다. 이 속성들은 CMD창에 전달되고, 출력되는 값들을 사용할지 안 할지를 설정하는 부분입니다. 그리고 이 세 개의 속성을 사용하기 위해서는 반드시 UseShellExecute 속성을 false로 설정해야 합니다. 안 그러면 Error를 던지게 됩니다.

이제 Dos 명령어를 CMD창에 전달하면 되는데, 이때 사용되는 코드가 Process.StandardInput.Write 코드입니다. Process에 전달 될 값은 Stream으로 처리되며, 이 코드는 Stream에 전달 할 명령을 쓰게하는 코드입니다. Write 메소드의 인자로 우리가 실행 할 명령을 할당하면 됩니다. 그리고 또 중요한 부분이 있는데, 실행 할 명령 다음에는 항상 캐리지 리턴(“\r\n”)이 들어가야 한다는 것입니다. 이 캐리지 리턴 값이 들어가지 않으면 CMD창은 명령을 인식하지 못하고 맙니다.(사실 이것 때문에 나름 고민했었지요~ 전혀 엉뚱한 메시지를 내보내거든요~ 이런 메시지요 “More ?”… 아주 지대 황당한 시츄레이션이지요~ 쩝… 
-_-;; )

전달 할 명령을 Stream으로 보내면, Process 클래스는 명령을 실행시키고 난 결과도 Stream으로 내보냅니다. 그게 StandardOutput 속성이고, 이렇게 내보낸 Stream을 읽으면 출력 결과를 받을 수 있습니다. 그리고 친절하게도 명령 실행 중 발생한 오류도 별도의 Stream 속성으로 제공하는데 바로 StandardError 속성입니다. 이 속성을 이용하면, 명령 실행 중 발생한 오류도 받아 볼 수 있게 됩니다. 

사용자 삽입 이미지
[그림 4 Dos 명령 실행 결과]

 

dir명령을 실행하면 StandardOutput 결과를 받아서 출력 값을 그대로 처리 할 수 있습니다. 이와 마찬가지로 실행 중 발생한 오류정보 까지도 StandardError 속성을 이용해 받을 수 있습니다.

 

이렇게 해서 C#코드를 이용한 Dos 명령 실행에 대해 간략히 알아봤습니다. 내부적으로 어떤 배치를 실행하거나, CMD 명령을 처리할 때 아마 유용하게 사용 할 수 있을 것 같습니다.

그럼 이만 여기에서 마치겠습니다. 감사합니다. ^O^v