문제

명령 줄 인수를 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는 명령 줄 인수를 포함하는 배열입니다.

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