|
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에 있는 쿼리 분석기입니다. (나름 흔히 사용하는 파일들을 예제로 넣어 두었습니다.) 이렇게추가된 코드는 아래와 같이 나타납니다.
저렇게 나타난 목록 중에 맘에 드는 것을 선택 후 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입니다.
[그림 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 속성입니다. 이 속성을 이용하면, 명령 실행 중 발생한 오류도 받아 볼 수 있게 됩니다.
dir명령을 실행하면 StandardOutput 결과를 받아서 출력 값을 그대로 처리 할 수 있습니다. 이와 마찬가지로 실행 중 발생한 오류정보 까지도 StandardError 속성을 이용해 받을 수 있습니다.
이렇게 해서 C#코드를 이용한 Dos 명령 실행에 대해 간략히 알아봤습니다. 내부적으로 어떤 배치를 실행하거나, CMD 명령을 처리할 때 아마 유용하게 사용 할 수 있을 것 같습니다.
그럼 이만 여기에서 마치겠습니다. 감사합니다. ^O^v
|