アットウィキロゴ
''' <summary>
'''
''' </summary>
''' <remarks></remarks>
Public Class CommandParse

    ''' <summary>
    ''' コマンドを解析する
    '''
    ''' 例. "-a bbb ccc -d eee"
    ''' このような引数を受け取ったとき下記のDictionaryに変換する
    ''' a,[bbb,ccc]
    ''' d,[eee]
    ''' </summary>
    ''' <param name="args"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Parse(ByVal args As String()) As Dictionary(Of String, List(Of String))

        Dim result As New Dictionary(Of String, List(Of String))

        If args Is Nothing Then
            Return result
        End If

        Dim commandName As String = String.Empty 'コマンド名
        Dim commandArgs As List(Of String) = Nothing 'そのコマンドの引数

        For Each currentStr As String In args

            If currentStr.StartsWith("-") Then
                'コマンド名なら

                '前に別のコマンドがあった場合は、登録
                If Not String.IsNullOrWhiteSpace(commandName) Then
                    result.Add(commandName, commandArgs)
                End If

                commandName = currentStr.Substring(1).Trim
                commandArgs = New List(Of String)

            Else
                'そのコマンドの引数なら

                If Not String.IsNullOrWhiteSpace(commandName) Then
                    commandArgs.Add(currentStr.Trim)
                End If

            End If

        Next

        '前に別のコマンドがあった場合は、登録
        If Not String.IsNullOrWhiteSpace(commandName) Then
            result.Add(commandName, commandArgs)
        End If

        Return result
    End Function


End Class

Imports CommandParser
Imports System.Windows.Forms

Module Module1

    Sub Main()

        Dim parser As New CommandParse

        Dim dic As Dictionary(Of String, List(Of String)) = parser.Parse(Environment.GetCommandLineArgs())

        Dim addressLst As Dictionary(Of String, Action(Of List(Of String))) = CreateAddressLst()

        For Each pair As KeyValuePair(Of String, List(Of String)) In dic

            Dim key As String = pair.Key.ToUpper

            If addressLst.ContainsKey(key) Then
                addressLst(key)(pair.Value)
            End If

        Next

    End Sub

    ''' <summary>
    ''' コマンドごとに関数を関連付け
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CreateAddressLst() As Dictionary(Of String, Action(Of List(Of String)))
        Dim addressLst As New Dictionary(Of String, Action(Of List(Of String)))

        addressLst.Add("CLIP", AddressOf ClipCmd)

        Return addressLst
    End Function

#Region "コマンドの内容"

    Private Sub ClipCmd(ByVal args As List(Of String))
        If Not CheckLower(args, 1) OrElse Not CheckUpper(args, 2) Then
            Return
        End If


        Dim pattern As String = String.Empty
        Dim numStr As String = String.Empty

        Select Case args.Count
            Case 1

                pattern = "1234567890"
                numStr = args(0)

            Case 2

                pattern = args(0)
                numStr = args(1)

            Case Else
        End Select

        Dim num As Integer = 0

        '数値に変換
        If Not Integer.TryParse(numStr, num) Then
            Return
        End If

        Dim clipStr As String = CreateString(pattern, num)
        Clipboard.SetText(clipStr)

    End Sub

#End Region

#Region "内部用の共通関数"

    ''' <summary>
    ''' 引数の下限をチェック
    ''' </summary>
    ''' <param name="args"></param>
    ''' <param name="low"></param>
    ''' <returns>
    ''' True : 引数の数がlow以上のとき
    ''' </returns>
    ''' <remarks></remarks>
    Private Function CheckLower(ByVal args As List(Of String), ByVal low As Integer) As Boolean
        Return args.Count >= low
    End Function

    ''' <summary>
    ''' 引数の上限をチェック
    ''' </summary>
    ''' <param name="args"></param>
    ''' <param name="up"></param>
    ''' <returns>
    ''' True : 引数の数がup以下のとき
    ''' </returns>
    ''' <remarks></remarks>
    Private Function CheckUpper(ByVal args As List(Of String), ByVal up As Integer) As Boolean
        Return args.Count <= up
    End Function

#End Region

#Region "メインのロジック"

    ''' <summary>
    ''' 文字列を作成
    '''
    ''' パターンを利用してn文字作成
    ''' </summary>
    ''' <param name="pattern">パターン</param>
    ''' <param name="num">文字数</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CreateString(ByVal pattern As String, ByVal num As Integer) As String

        Dim resultString As New System.Text.StringBuilder()
        Dim patternLength As Integer = pattern.Length

        For i As Integer = 0 To num - 1
            Dim currentIndex As Integer = i Mod patternLength
            Dim currentStr As String = pattern(currentIndex)
            resultString.Append(currentStr)
        Next

        Return resultString.ToString
    End Function

#End Region

End Module
最終更新:2014年04月20日 03:33