2008-10-20 8 views
2

피험자는 한 줄로 질문하기 쉽지 않은 이유를 많이 말하지 않습니다. 레지스트리에서 읽은 몇 가지 프로그램을 실행해야합니다. 누군가가 전체 경로와 논쟁을 저장하는 분야에서 읽어야합니다.
저는 System.Diagnostics.ProcessStartInfo를 사용하여 프로그램 이름과 해당 인수를 설정했지만 다양한 필드를 처리 할 수있는 파일을 저장하기 위해 구문 분석해야하는 다양한 인수를 발견했습니다. 다른.인수가 시작되는 위치를 모르는 프로그램을 어떻게 실행합니까?

전체 문자열을 그대로 실행하는 방법이 있습니까?

+1

누군가가이 질문에 대해 자세히 설명해 주시겠습니까? 분명히 데드랙은 그의 대답이 받아 들여진 이후 그것을 이해했습니다. 그가 레지스트리에서 읽으려는 것 ... 프로그램, 프로그램 이름, 기타? –

답변

6

위의 포스터와 같은 방식으로 프로세스 시작 정보와 함께 cmd.exe를 사용했습니다.

Process myProcess = New Process; 
myProcess.StartInfo.FileName = "cmd.exe"; 
myProcess.StartInfo.Arguments = "/C " + cmd; 
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
myProcess.StartInfo.CreateNoWindow = True; 
myProcess.Start(); 
myProcess.WaitForExit(); 
myProcess.Close(); 

cmd/c는 명령을 수행 한 다음 종료합니다. WaitForExit은 프로세스가 너무 오래 실행되면 프로세스를 종료합니다.

+0

작동합니다! UI 스레드에서 프로세스를 시작하기 때문에 waitforexit 절을 삭제해야했습니다. +1 감사하고 답변했습니다. – sebagomez

0

사실 몇 가지가 있습니다.

  1. /C [명령 줄]을 인수로 사용하여 cmd.exe를 호출 할 수 있습니다. 이로 인해 cmd.exe가 명령을 처리 한 다음 종료합니다.
  2. 배치 파일에 명령을 쓰고 실행할 수 있습니다.

물론 지금 취하고있는 접근법, 즉 명령 행 구문 분석이 있습니다.

+0

옵션 1은 cmd.exe를 파일 이름으로 사용하고 '/ c '을 인수로 사용하여 ProcessInfo를 시작한다는 의미입니까? – sebagomez

+0

나는 ProcessStartInfo를 의미한다고 생각하지만, 그걸 채우고 Process.Start로 넘겨 준다. 백그라운드에서 실행하려면 UseShellExecute를 false로 설정해야 할 수 있습니다. 명령이 실행되는 동안 CMD.EXE 창을 숨길 필요가 없으면 Process.Start ("cmd.exe", "/ c"+ myargs)를 사용할 수 있습니다. –

+0

프로세스 창이 끝날 때까지 cmd 창이 열립니다. – sebagomez

0

설정되지 않은 'UseShellExecute을'System.Diagnostics.Process가 실제로 (당신이 사용자/도메인/암호를 지정하면이 두 번째 사용) 프로그램을 시작 CreateProcess 또는 CreateProcessAsUser 중 하나를 호출합니다. 그리고이 두 호출은 명령과 파일을 하나의 인수로 취할 수 있습니다. MSDN에서 :

lpApplicationName 매개 변수는 NULL 일 수 있습니다. 이 경우 모듈 이름은 lpCommandLine 문자열의 첫 번째 흰색 공백 구분 토큰이어야합니다. ...

lpApplication 이름은 ProcessStartInfo.Filename에 매핑되고 lpCommandLine은 인수에 매핑됩니다. 그럼 그냥 가야만합니다 :

var processStartInfo = new ProcessStartInfo() 
{ 
    UseShellExecute = false, 
    Arguments = cmd 
}; 
Process.Start(processStartInfo);