''' <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