2010-01-29 2 views
0

클라이언트의 레지스트리에는 실행 가능한 명령이 저장되어 있습니다. 문자열은 대상 경로 주위에 따옴표가있을 수도 있고 없을 수도 있으며 매개 변수가 있거나 없을 수도 있습니다. 예를 들어선택적 매개 변수와 따옴표가있는 명령 문자열에서 Path.GetDirectoryName 사용

"C는 : \ 경로 \ file.exe가"은 PARAM1 = VALUE1 PARAM2 =는
C를 값 2 : \ 경로 \ file.exe가 PARAM1 = VALUE1 PARAM2 =는
"C가 값 2 : \ 경로 \ 파일 이 .exe "
C : \ 경로 \ file.exe가
"C : spaces.exe "

와 \ 경로 \ 파일 : spaces.exe와 \ 경로 \ 파일 C"PARAM1 = VALUE1 PARAM2 =
는 값 2를 "

대상 경로의 디렉토리를 가져와야합니다 (예 : C:\path).

  • Path.GetDirectoryName을 시도했지만 "잘못된 문자가있는 경로"와 함께 실패합니다.
  • 나는 또한 ProcessStartInfo 개체를 만들려고했으나 문자열을 구문 분석하는 것이 현명하지 않은 것 같습니다.
  • 나는 Uri으로 피봇을 쳤지 만 거기에는 행운이 없었습니다.

정규 표현식을 사용하여 솔루션을 만들었지 만 (이 내용은 답변으로 게시 할 예정입니다.) "이것이 꼭 있어야 할 것 같습니다."- Net-helper-class- for-this "문제.

클래스가 누락되었거나 올바르게 위의 클래스를 사용하지 않고 있습니까?

+0

사이드 주제 ...이 레지스트리 키에 * anything *을 (를) 입력 할 수 있습니까? –

+0

@Austin : 우리는 WiX 설치에서 사용자 지정 작업의 일부로 값을 필요로합니다. 문자열은 우리가 사용하던 이전 설치 관리자 소프트웨어에 의해 그곳에 배치됩니다. 따라서 다소 제한적이지만 위의 형식은 모든 가능성이 있습니다. 값이 유효한 명령 문자열이 아닌 경우를 처리하는 것에 대해 걱정하지 않습니다. 그것은 단지 실패 할 것이다. –

답변

1

다음은 정규 표현식입니다. 하지만 제 질문에 말했듯이 더 좋은 방법이 있습니까? 또는 이것이 실패 할 경우가 있습니까?

var strings = value.Split(" ", 2); 
var firstString = strings.Length == 0 ? string.Empty : strings[0]; 
return Path.GetDirectoryName(firstString); 

를하지만 나 자신을 때렸다 :

Regex pattern = new Regex(@"^(?<quot>"")?(?<path>(?(quot)[^""]|\S)*)", RegexOptions.ExplicitCapture); 
var match = pattern.Match(value); 
return Path.GetDirectoryName(match.Groups["path"].Value); 
+1

가까이에있는 특정 작업에 대해 나에게 꽤 좋아 보인다. – Lucero

0

가 나는 게시했다.

그렇다면 http://community.bartdesmet.net/blogs/bart/archive/2009/02/21/net-4-0-system-shell-commandline-parsing-part-1.aspx을 보았습니다. (그것은 구문 분석의 측면을 처리하는 것처럼 보이지 않는데, 실제로 존재하지 않습니다!)

표준 System.IO 클래스 중 하나를 당신이 찾고있는 파싱의 유형을 제공하므로 귀하의 정규 표현식 누군가가 공통점을 찾지 못하면 괜찮습니다.

Reflector를 보면 명령 줄 구문 분석을 수행하는 코드가 모두 Native로 표시되므로이 목적을 위해 표준 API가 누락되지 않았 음을 확신 할 수 있습니다 (파일 이름이 표현 된) 외부에있는 것으로 간주됩니다. NET (플랫폼 특정 의미).

관련 문제