콘솔 애플리케이션에 대한 일부 명령 줄 인수를 읽으려고
-
21-08-2019 - |
문제
매우 간단한 .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
. 이것은 위의 솔루션과 달리 명령 줄 글로브와 잘 작동하지 않습니다.