2011-07-13 18 views
1

多くのプログラムがフラグ付きのコマンドライン引数を受け取ります。たとえば、gcc hello.c -o helloです。もちろん、私は自分のアプリケーションでそれを実装することができますコマンドライン引数の信頼できるパターン

Dim args() As String = Environment.GetCommandLineArgs() 
Dim oi As Integer = Array.IndexOf("-o", args) 
If oi > -1 AndAlso oi < args.Length Then 
    CompileTo(args(oi + 1)) 'Or whatever 
Else 
    CompileTo("out.exe") 'Or whatever 
End If 

しかし、それは醜いと使い迷惑な、エラーを起こしやすい、と非効率的です。私が見過ごしているより良い方法は何ですか?

答えて

1

多くの(ほとんどの)Linuxプログラムでは、これらのオプションはgetoptによって処理されます。これは非常に汎用性の高いシステムなので、インスピレーションを得るためには良いポイントかもしれません。

3

Best way to parse command line arguments in C#?をチェックアウトしても、同様のトピック(C#では問題ありません)について興味深い回答がいくつかあります。また、使用したいと思うかもしれない "ready-to-use"ライブラリへのリンクも表示されます。

+0

1は素晴らしく、非常に柔軟に見えます! – fvu

+1

素晴らしいですね!私はそれが私のアプリケーションのために追加することが少しあるかもしれないと思う。 +1 – Ryan

-1

は とフォームの作成 - テキストボックスの名前optstringに、テキストを:-in "C:私のファイルは\私のドキュメント\" + N -sort:-xyz - (間違ったオプションの略)テキストボックスの名前WOP - ParseBt という名前のボタン - (リッチテキストボックスの略)RTBという名前のRichTextBox

このコードを追加し、それを実行します。

Public Class Form1 
Dim ListOfPossibleOptions As New Collection 

Dim RejectedOptions As String 

Private Sub ParseBt_Click(sender As System.Object, e As System.EventArgs) Handles ParseBt.Click 
    ListOfPossibleOptions.Clear() 
    ListOfPossibleOptions.Add(New OneOption("Input", " "c, True)) 
    ListOfPossibleOptions.Add(New OneOption("Sort", ":"c)) 
    ListOfPossibleOptions.Add(New OneOption("New")) 

    ParseOptions(ListOfPossibleOptions, RejectedOptions) 

    Dim s As String = "" 
    For Each CurrOption As OneOption In ListOfPossibleOptions 
     s &= CurrOption.OptionText & ": " 
     If CurrOption.Present Then 
      s &= "Present option=" & CurrOption.OptionChar 
      If CurrOption.ValueReq Then 
       s &= " value=" & CurrOption.TextValue 
      End If 
     Else 
      s &= "not present" 
     End If 
     s &= vbCrLf 
    Next 
    rtb.Text = s 
End Sub 
Sub ParseOptions(ListOfPossibleOptions As Collection, RejectedOptions As String) 
    Dim Fnd As Boolean 
    Dim OptionString As String = OptString.Text.Trim.ToUpper & " " 
    Dim OptionFnd As OneOption 
    RejectedOptions = "" 
    While OptionString.Length() > 0 
     Fnd = False 
     Do While True 
      For Each CurrOption As OneOption In ListOfPossibleOptions 
       Dim ot As String = CurrOption.OptionText.ToUpper 
       For l As Integer = 1 To CurrOption.OptionText.Length 
        If l < OptionString.Length Then 
         Debug.WriteLine("|" & ot.Substring(0, l) & "|" & OptionString.Substring(1, l) & "|") 
         If ot.Substring(0, l) = OptionString.Substring(1, l) Then 
          If OptionString.Substring(1 + l, 1) = CurrOption.Separator Then 
           Fnd = True 
           OptionFnd = CurrOption 
           OptionFnd.Present = True 
           OptionFnd.OptionChar = OptionString(0) 
           OptionString = OptionString.Substring(l + 2) 
           Exit Do ' found 
          End If 
         Else 
          Exit For ' next possible option 
         End If 
        End If 
       Next 
      Next 
      Exit Do ' not found 
     Loop 
     If Not Fnd Then 
      Dim i As Integer = OptionString.IndexOf(" ") 
      RejectedOptions &= OptionString.Substring(0, i) & " " 
      OptionString = OptionString.Substring(i).TrimStart 
     Else 
      If OptionFnd.ValueReq Then 
       If OptionFnd.Quoted Then 
        If OptionString(0) = """" Then 
         OptionString = OptionString.Substring(1) 
         Dim i As Integer = OptionString.IndexOf("""") 
         If i > -1 Then 
          OptionFnd.TextValue = OptionString.Substring(0, i) 
          OptionString = OptionString.Substring(i + 1).TrimStart 
         Else ' closing quote missing 
          i = OptionString.IndexOf(" ") 
          OptionFnd.TextValue = """" & OptionString.Substring(0, i) 
          OptionString = OptionString.Substring(i).TrimStart 
         End If 
        Else ' not quoted 
         Dim i As Integer = OptionString.IndexOf(" ") 
         OptionFnd.TextValue = OptionString.Substring(0, i) 
         OptionString = OptionString.Substring(i).TrimStart 
        End If 
       Else ' never quoted 
        Dim i As Integer = OptionString.IndexOf(" ") 
        OptionFnd.TextValue = OptionString.Substring(0, i) 
        OptionString = OptionString.Substring(i).TrimStart 
       End If 
      End If 
     End If 
    End While 
    wop.Text = RejectedOptions 
End Sub 
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
End Sub 
End Class 
Public Class OneOption 
'input 
Friend OptionText As String ' required 
Friend Separator As Char ' if specified, CurrOption value follows the option, like : in -SORT:A 
Friend Quoted As Boolean ' value may be "q u o t e d" 
'work 
Friend ValueReq As Boolean ' is value required (as seperator was given in NEW)? 
'output 
Friend Present As Boolean ' option present 
Friend OptionChar As Char ' options was preceeded by + -/whatever 
Friend TextValue As String ' the value following the option 
Sub New(pOptionText As String) ' option without a value, a switch 
    OptionText = pOptionText 
    reset() 
End Sub 
Sub New(pOptionText As String, pSeparator As Char) ' option with a value, the separator between option and value has to be specified 
    OptionText = pOptionText 
    reset() 
    Separator = pSeparator 
    ValueReq = True 
    Quoted = False 
End Sub 
Sub New(pOptionText As String, pSeparator As Char, pQuoted As Boolean) ' option with a possibly "quoted value", the separator between option and value has to be specified 
    OptionText = pOptionText 
    reset() 
    Separator = pSeparator 
    ValueReq = True 
    Quoted = pQuoted 
End Sub 
Sub reset() 
    Separator = " "c 
    Quoted = False 
    Present = False 
    ValueReq = False 
End Sub 
End Class 
+0

私はコンソールアプリケーションに入っていますが、Windows Formsのデモは無関係です...無関係です。私はあなたのコードを理解していると思うが、それはちょっと大きく、あまりよく書かれていない...(例えばDo While True ... Loopを使わないでください)。 – Ryan

+0

拒否する前に解決策を見てください! ParseOptionsルーチンは、コンソール環境で必要なものすべてを実行します。フォームは実行してデモンストレーションするためのものです。次回は幸運です。 – Martin

+0

さて、はい、あなたはそれをうまく動作させるために乱雑にする必要はありませんでした。そして、あまりにも複雑な文字列検索アルゴリズムがあります。私はすでに答えがあります。 – Ryan

関連する問題