문제

매우 간단한 .NET 콘솔 응용 프로그램이 있습니다. 나는 어떤 명령 줄 주장을 전달하고 싶습니다 ... 거기에서 힘든 것은 없습니다.

자, 키커는 보통 하나의 논쟁을 위해 내가 전달하고자하는 항목 목록이 있습니다. 이 경우 파일 목록. 나는 이것을하는 가장 좋은 방법을 확신하지 못한다.

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 

그러나 공백이있는 파일 이름은 어떻습니까? comma를 삭제해야합니까?

흥미롭게 만들기 위해, 나는 단일 값을 받아들이는 다른 args를 가지고 있습니다.

eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello

또는

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
도움이 되었습니까?

해결책

아마도 당신이 작업중 인 프로그램에 조금 늦었을 것입니다. mono.options

static void Main(string[] args)
{
    //let's try this mono.options thing shall we?
    string xapfile = null;
    var files = new List<string>();
    var p = new Mono.Options.OptionSet()
    {
        { "xap=", v => xapfile =v },
        { "file:", v => files.Add(v)}
    };
    List<string> extra = p.Parse(args);


    Console.WriteLine(@"
    xap = '{0}', 
    file(s)= {1}", 
         xapfile, 
         string.Join(",", files.ToArray())
    );
    Console.WriteLine(@"
    left overs: {0}", 
        string.Join(Environment.NewLine, extra.ToArray())
    );
    // rest of your Main here

구문을 호출하는 것이 될 것입니다

myapp.exe --file="file 1" --file="file 2" --file="file 3"

전체 파일 변수를 포기하고 왼쪽 오버를 파일로 취급하고 다음과 같이 호출 할 수도 있습니다. myapp.exe "file 1" "file 2" "file 3" 추가 목록에서 파일을 뽑아냅니다.

mono.options는 매우 강력합니다. 당신은 사용할 필요조차 없습니다 -당신이 사용할 수있는 것 같습니다. /file= 또는 -file=

불행히도 Windows는 옵션을 PowerShell CMDLET에 전달하지 않는 한 Globbing을 수행하지 않으므로 직접 수행해야합니다. 그래도 꽤 쉽습니다. 여기에 있습니다 과거에 확장하기 위해 사용한 약간의 코드 *.foo 또는 "c:\temp\*.bar|c:\temp\*.txt"

또한 Talkies에서 파일 이름을 감싸지 않는 한 Comma가 파일 이름으로 유효하기 때문에 Comma를 분리하지 않을 것입니다. 당신은 언젠가 당신을 물게 될 것이라는 것을 알고 있습니다 :-) 파이프는 좋은 선택을하지만, 대화에서 전체 표현을 감싸는 경우에만 Windows는 배관을하고 있다고 생각합니다. 아, 명령 줄 처리의 기쁨 :-)

다른 팁

각 인수는 공간이 포함 된 경우 인용문으로 둘러싸여 있어야합니다. 그렇지 않으면 나는 그것에서 인용문을 남겨 둘 것입니다.

당신의 껍질이 아마도지지 될 것입니다 와일드 카드 글로브 입력 파일을 일반 공간 분리 목록으로 허용하고 파일 이름에 공백이 포함 된 경우 인용문으로 둘러싸여 있거나 문자를 통해 이미 빠져 나갈 것이라고 가정하는 것이 가장 좋습니다. 평범한 것은 -F 또는 /F 스타일 스위치를 포함하지 않는다는 것을 의미합니다.

약간 덜 일반적인 기술이지만 명령 줄 구문 분석을 수행하는 모든 라이브러리에서 지원하거나 지원하는 것은 양식의 여러 항목을 허용하는 것입니다. -f foo.txt -f bar.txt. 이것은 위의 솔루션과 달리 명령 줄 글로브와 잘 작동하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top