문제
명령 줄 인수를 C# 응용 프로그램에 전달하려고하지만 이와 같은 것을 전달하는 데 문제가 있습니다.
"C:\Documents and Settings\All Users\Start Menu\Programs\App name"
내가 추가하더라도 " "
논쟁에.
내 코드는 다음과 같습니다.
public ObjectModel(String[] args)
{
if (args.Length == 0) return; //no command line arg.
//System.Windows.Forms.MessageBox.Show(args.Length.ToString());
//System.Windows.Forms.MessageBox.Show(args[0]);
//System.Windows.Forms.MessageBox.Show(args[1]);
//System.Windows.Forms.MessageBox.Show(args[2]);
//System.Windows.Forms.MessageBox.Show(args[3]);
if (args.Length == 3)
{
try
{
RemoveInstalledFolder(args[0]);
RemoveUserAccount(args[1]);
RemoveShortCutFolder(args[2]);
RemoveRegistryEntry();
}
catch (Exception e)
{
}
}
}
그리고 여기에 내가 지나가는 것이 있습니다.
C:\WINDOWS\Uninstaller.exe "C:\Program Files\Application name\" "username" "C:\Documents and Settings\All Users\Start Menu\Programs\application name"
문제는 내가 첫 번째와 두 번째 Args를 올바르게 얻을 수 있다는 것입니다. 그러나 마지막은 다음과 같습니다. C:\Documents
.
도움이 있습니까?
해결책
방금 수표를 실행하고 문제를 확인했습니다. 그것은 나를 놀라게했다. 그러나 그것은 첫 번째 논쟁에서 마지막이다.
"C:\Program Files\Application name\" <== remove the last '\'
이것은 더 많은 설명이 필요합니다. 아무도 아이디어가 있습니까? 나는 그것을 버그라고 부르는 경향이 있습니다.
2 부, 나는 몇 번 더 테스트를했고
"X:\\aa aa\\" "X:\\aa aa\" next
becomes
X:\\aa aa\
X:\\aa aa" next
약간의 Google 액션은 a의 통찰력을 제공합니다 Jon Galloway의 블로그, 기본 규칙은 다음과 같습니다.
- 백 슬래시는 탈출 캐릭터입니다
- 항상 따옴표를 피하십시오
- 그들이 인용하기 전에 백 슬래시 만 탈출합니다.
다른 팁
이안 켐프의 대답을 추가합니다
어셈블리가 "myprog.exe"라고하고 문자열을 통과하는 경우 "c : documents and settings all user start start program app name"링크
C:\>myprog.exe "C:\Documents and Settings\All Users\Start Menu\Programs\App name"
문자열 "C : 문서 및 설정 모든 사용자 시작 메뉴 프로그램 앱 이름"
Args [0]에있을 것입니다.
다른 사람들이 이미 말한 것을 추가하기 위해서는 탈출 문제 일 수 있습니다. 다른 백 슬래시로 백 슬래시를 피해야합니다.
다음과 같아야합니다.
C : > myProg.exe "C : Documents and Settings 모든 사용자 시작 메뉴 프로그램 앱 이름"
나는 최근에도 똑같은 성가신 문제를 발견하고 사령관을 작성하기로 결정했다.
참고 : 문제는 .NET Commandline 인수가 정적 무효 기본 (String [] args) 함수가 Escapes "및 로 전달된다는 것입니다. 이것은 실제로 인용문 또는 인용문이있는 인수를 전달하고 싶을 수 있기 때문에 디자인에 의한 것입니다. 백 슬래시. 한 예 :
다음을 단일 논증으로 전달하고 싶다고 가정 해 봅시다.
-MSG : "어디 있니?"
예를 들어.
SampleApp -msg : "Hey, "어디에서? "" "
기본 동작으로 보내는 방법입니다.
다른 사람이 프로그램에 대한 따옴표 나 백 슬래시를 탈출 해야하는 이유가 없다면, 아래와 같이 자신의 구문 분석기를 사용하여 명령 줄을 구문 분석 할 수 있습니다.
즉. [프로그램] .exe "C : Test "arg1 arg2
args [0] = c : test "arg1 arg2가있을 것입니다.
당신이 기대할 수있는 것은 args [0] = c : test 그리고 args [1] = arg1 및 args [2] = arg2입니다.
아래 함수는이 단순화 된 동작으로 인수를 목록에 구문 분석합니다.
Arg [0]은 아래 코드를 사용하는 프로그램 이름입니다. (목록을 호출하십시오 .ToArray ()는 결과 목록을 문자열 배열로 변환합니다.)
protected enum enumParseState : int { StartToken, InQuote, InToken };
public static List<String> ManuallyParseCommandLine()
{
String CommandLineArgs = Environment.CommandLine.ToString();
Console.WriteLine("Command entered: " + CommandLineArgs);
List<String> listArgs = new List<String>();
Regex rWhiteSpace = new Regex("[\\s]");
StringBuilder token = new StringBuilder();
enumParseState eps = enumParseState.StartToken;
for (int i = 0; i < CommandLineArgs.Length; i++)
{
char c = CommandLineArgs[i];
// Console.WriteLine(c.ToString() + ", " + eps);
//Looking for beginning of next token
if (eps == enumParseState.StartToken)
{
if (rWhiteSpace.IsMatch(c.ToString()))
{
//Skip whitespace
}
else
{
token.Append(c);
eps = enumParseState.InToken;
}
}
else if (eps == enumParseState.InToken)
{
if (rWhiteSpace.IsMatch(c.ToString()))
{
Console.WriteLine("Token: [" + token.ToString() + "]");
listArgs.Add(token.ToString().Trim());
eps = enumParseState.StartToken;
//Start new token.
token.Remove(0, token.Length);
}
else if (c == '"')
{
// token.Append(c);
eps = enumParseState.InQuote;
}
else
{
token.Append(c);
eps = enumParseState.InToken;
}
}
//When in a quote, white space is included in the token
else if (eps == enumParseState.InQuote)
{
if (c == '"')
{
// token.Append(c);
eps = enumParseState.InToken;
}
else
{
token.Append(c);
eps = enumParseState.InQuote;
}
}
}
if (token.ToString() != "")
{
listArgs.Add(token.ToString());
Console.WriteLine("Final Token: " + token.ToString());
}
return listArgs;
}
WWC의 답변에 따라 Jamezor는 첫 번째 캐릭터가 인용문이면 그의 코드가 실패 할 것이라고 언급했습니다.
해당 문제를 해결하려면 StartToken 케이스를 다음과 같이 대체 할 수 있습니다.
if (eps == enumParseState.StartToken)
{
if (rWhiteSpace.IsMatch(c.ToString()))
{
//Skip whitespace
}
else if (c == '"')
{
eps = enumParseState.InQuote;
}
else
{
token.Append(c);
eps = enumParseState.InToken;
}
}
정확히 문제는 무엇입니까? 어쨌든 여기에 몇 가지 일반적인 조언이 있습니다.
기본 메소드 (program.cs)가 다음과 같이 정의되어 있는지 확인하십시오.
void Main(string[] args)
Args는 명령 줄 인수를 포함하는 배열입니다.