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

2012.11.04 01:12 개발언어/C#.NET

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();

[코드 실행 코드]

 

위에서 보셨던목록에 실행시킬 프로그램을 추가하는 코드는실제 프로그램 명뿐만 안니라실행파일명과 실행 시에 할당  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

신고