2011-09-16 5 views
0

다음 코드 스 니펫을 찾았습니다.StartInfo.Arguments in C#

using System; using System.Diagnostics;

public class RedirectingProcessOutput 
{ 
    public static void Main() 
    { 
     Process p = new Process(); 
     p.StartInfo.FileName = "cmd.exe"; 
     p.StartInfo.Arguments = "/c dir *.cs"; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.Start(); 

     string output = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 

     Console.WriteLine("Output:"); 
     Console.WriteLine(output);  
    } 
} 

그러나이 p.StartInfo.Arguments = "/c dir *.cs";은 무엇을하고 있는지 알 수 없습니까? 어떤 설명을 주셔서 미리 감사드립니다.

+1

샘플 코드입니다. 의심의 여지가 없습니다. 그러나 실제로 그것을 사용하지 마십시오. Directory.GetFiles() 메소드는 * lot * 적은 오버 헤드로 동일한 작업을 수행합니다. –

답변

1

처음에는 exec(3)과 그 친구들이 실행 파일의 경로와 변수에 대한 포인터의 가변 길이 목록을 허용했습니다. 정상적인 운영 체제에서 시작되는 프로세스는 각 단어에 대한 포인터와 개별 문자열을 포함하는 인수 목록에 한 지점을받습니다. 일반 쉘은 명령 행을 구문 분석하고 exec (3)에 필요한 인수 목록을 채 웁니다.

exec ("some.executable.file", "arg1" , "arg2" , "arg3" , ...) ; 

어떤 프로세스의 엔트리 포인트에 전달됩니다 :

INT 주 (문자 * 인자를 확인 [

당신은 간부 (3)에 의해 허용 인수 목록 사이의 직접적인 상관 관계를 볼 수 있습니다 ]) {...}

argv[0]이 실행 파일 이름입니다

argv[1]argv[n-2] 개별 인수하고, argv[n-1]이를 나타 내기 위해 NULL 포인터입니다 인수 목록의 끝.

개념적으로 간단하고 구현하기 쉽습니다.

CP/M은 그렇게하지 않았습니다 (제한된 메모리로 인해). 시작된 프로세스를 쉘에서 원시 명령 행의 주소로 전달하고 프로세스의 구문 분석을 그대로 둡니다.

DOS는 1982 년에 CP/M의 복제본으로 시작하여 원시 처리 명령 행의 주소도 처리했습니다.

Windows는 처음 시작한 이후로 해당 모델에서 벗어나지 않았습니다. 는 Win32 CreateProcess() 기능은

BOOL WINAPI CreateProcess(
    __in_opt  LPCTSTR lpApplicationName, 
    __inout_opt LPTSTR lpCommandLine, 
    ... 
); 

여전히 프로그램에 전달되는 원시 명령 줄을 통과, 같은 일을한다. 물론 C 런타임 라이브러리는 커맨드 라인 파싱을 처리합니다.

CLR/.Net 세계에서 이러한 모든 역사 때문에 CLR은 Win32 API에 종속적으로 설계 되었기 때문에 시작할 명령에 완전한 명령 줄을 전달했습니다.왜 그들이 params string[]을 전달하지 못하게하고 CLR이 명령 줄을 작성하게 만들지 않았습니까? Microsoft의 개발자들이 가슴 가까이에 보관 해 놓은 것입니다.

시작 프로그램에 필요한 명령 줄을 작성하는 것은 간단합니다. 각 인수를 인수를 분리하는 SP 문자가있는 단일 문자열로 결합하기 만하면됩니다. 쉬운!

... 인수 중 하나에 공백이나 큰 따옴표 (")가 포함될 때까지 ....

그런 다음 인수 중 하나 또는 모두를 인용해야합니다. 쉬운 일이지만, 기괴한 견적 규칙 때문에, 당신을 위로 여행 할 수있는 많은 가장자리 조건이 있습니다.

Windows 명령 줄은 공백으로 구분 된 단어로 나뉘며, 큰 따옴표 (")로 선택적으로 인용 할 수 있습니다. 부분적으로 Windows에서도 경로 구분 기호가 잘못 되었기 때문에 (/이 아닌 \) 인용 규칙은 ... byzantine입니다. Windows CRT 소스 코드 (이 파일은 (VisualStudioInstallLocation) \ VC \ crt \ src \ stdargv.c와 유사 함)를 파고 들면 명령 줄 해석 코드를 찾을 수 있습니다.

2

시작될 프로세스에 command line arguments이 전달됩니다.

이 경우 프로세스는 Windows 쉘 (cmd.exe)입니다. 명령 줄을 전달하면 시작될 때이 명령을 실행할 수 있습니다. 그런 다음 시작시 /c 매개 변수로 인해 자체 종료됩니다.

따라서 명령 프롬프트를 열고 dir *.cs 명령을 입력하면 프로세스의 결과물을 얻을 수 있습니다.

0

그 행은 그 프로세스에 인수를 제공합니다.