programing

WPF 명령줄 인수, 스마트한 방법?

linuxpc 2023. 4. 21. 20:17
반응형

WPF 명령줄 인수, 스마트한 방법?

사용자가 전달한 인수 값을 읽는 방법만으로 명령줄 인수를 WPF 응용 프로그램에 해석할 수 있는 방법을 찾고 있습니다.

예로서

application.exe /setTime 5

이렇게 말할 수 있는 코드가 있을까요?

MessageBox.Show(arg("setTime"));

어떤 것이 출력됩니까?5

현용 솔루션

스마트 WPF 명령줄 인수 작성 방법

이 방법은 항상 인수를 "이름"/"값" 쌍으로 지정하는 것입니다.

myprogram.exe -arg1 value1 -arg2 value2

즉, 명령줄을 해석할 때 인수/값 페어를 다음 명령어에 넣을 수 있습니다.Dictionary인수를 키로 합니다.그럼 당신의arg("SetTime")다음과 같이 됩니다.

MessageBox.Show(dictionary["SetTime"]);

(실제 사전이 공개되는 것을 원하지 않는 것이 분명합니다.)

처음에 인수를 가져오려면 다음을 사용합니다.

string[] args = Environment.GetCommandLineArgs();

그러면 모든 인수가 반환되므로 2단계에서 배열을 해석해야 합니다(먼저 길이가 2+1의 배수인지 확인한 후).

어레이의 첫 번째 요소는 실행 중인 프로그램 이름 MS Learn입니다.따라서 루프는 다음 중 하나부터 시작해야 합니다.

for (int index = 1; index < args.Length; index += 2)
{
     dictionary.Add(args[index], args[index+1]);
}

각 인수를 정의할 때 이 루프는 ID와 실제 값 자체의 쌍으로, 예를 들어 다음과 같습니다.

my.exe -arg1 value1 -arg2 value2

그러면 단순히 인수가 지정되어 있는지 여부를 확인할 수 있습니다.-arg1사전에 있는 값을 읽습니다.

string value;
if (dictionary.TryGetValue(arg, out value))
{
    // Do what ever with the value
}

즉, 임의의 순서로 인수를 지정할 수 있으며 지정하지 않을 인수를 생략할 수 있습니다.

이 방법의 유일한 단점은 다음과 같은 플래그가 있는 경우입니다.-debug(예를 들어) 플래그의 유무에 따라 논리적으로 구현될 수 있는 것은 다음과 같이 지정해야 합니다.-debug true(또는1또는on값을 필요로 하는 플래그(설정 파일 경로, 데이터베이스 연결 문자열 등)가 있으면 작업이 간소화됩니다.

WPF에는 다른 방법이 있습니다.다음은 이에 대한 기사이며, 취해야 할 단계입니다.

먼저, 당신이 엽니다.App.xaml그리고 당신이 덧붙인다Startup="Application_Startup"그 후StartupUri="Window1.xaml", 그래서 당신의App.xaml다음과 같이 됩니다.

<Application x:Class="ParametersForWPF.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>

그 후 기능합니다.Application_Startup에 자동으로 추가됩니다.App.xaml.cs파일:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {

    }
}

이제 이 기능 안에서args어플리케이션에 송신됩니다.이를 위한 예는 다음과 같습니다.

private void Application_Startup(object sender, StartupEventArgs e)
{
    foreach(string s in e.Args)
    {
        MessageBox.Show(s);
    }
}

필요한 경우DictionaryChrisF의 답변을 쉽게 구현할 수 있습니다.Application_Startup★★★★★★ 。

예를 들어, 이것이 내가 두 가지 유형의 논쟁을 처리하는 방법이다.

myapp.exe -my-flag -another-flag -value-flag "Hello World"

Dictionary<string, string> arguments = new Dictionary<string, string>()

//e from StartupEventArgs e

for (int index = 0; index < e.Args.Length; index += 2)
{
    if(e.Args.Length == index+1 || e.Args[index + 1].StartsWith("-"))
    {
        arguments.Add(e.Args[index], string.Empty);
        index--;
    }
                    

    if (e.Args.Length >= index + 1 && !e.Args[index + 1].StartsWith("-"))
        arguments.Add(e.Args[index], e.Args[index + 1]);
}

이렇게 해서 값을 확인할 수 있습니다.

if(arguments.ContainsKey("my-flag")){
   arguments.TryGetValue("value-flag", valueFlag)
}

언급URL : https://stackoverflow.com/questions/9343381/wpf-command-line-arguments-a-smart-way

반응형