アットウィキロゴ
HermitDown.exe -from %~n1 -to C:\Users\TestUser\Desktop\先

Imports System.IO

Module Module1

    Sub Main()

        Dim parser As New CommandParser
        Dim cmd As Dictionary(Of String, List(Of String)) = parser.Parse(Environment.GetCommandLineArgs)

        If Not cmd.ContainsKey("to") _
            OrElse cmd("to").Count = 0 Then

            MsgBox("to:コピー先のディレクトリを指定してください")
            Return
        End If

        If Not cmd.ContainsKey("from") _
            OrElse cmd("from").Count = 0 Then

            MsgBox("from:コピー元のフォルダを指定してください")
            Return
        End If

        Dim fromFolder As String = cmd("from")(0)
        Dim toFolder As String = cmd("to")(0)

        CopyDirectory(fromFolder, toFolder)

    End Sub

    ''' <summary>
    ''' ディレクトリをコピーする
    ''' </summary>
    ''' <param name="sourceDirName">コピーするディレクトリ</param>
    ''' <param name="destDirName">コピー先のディレクトリ</param>
    Public Sub CopyDirectory( _
            ByVal sourceDirName As String, _
            ByVal destDirName As String)

        'コピー先のディレクトリがないときは作る
        If Not System.IO.Directory.Exists(destDirName) Then
            System.IO.Directory.CreateDirectory(destDirName)
            '属性もコピー
            System.IO.File.SetAttributes(destDirName, _
                System.IO.File.GetAttributes(sourceDirName))
        End If

        'コピー先のディレクトリ名の末尾に"\"をつける
        If destDirName.Chars((destDirName.Length - 1)) <> _
                System.IO.Path.DirectorySeparatorChar Then
            destDirName = destDirName + System.IO.Path.DirectorySeparatorChar
        End If

        'コピー元のディレクトリにあるファイルをコピー
        Dim fs As String() = System.IO.Directory.GetFiles(sourceDirName)
        Dim f As String
        For Each f In fs
            System.IO.File.Copy(f, _
                destDirName + System.IO.Path.GetFileName(f), True)
        Next

        'コピー元のディレクトリにあるディレクトリをコピー
        Dim dirs As String() = System.IO.Directory.GetDirectories(sourceDirName)
        Dim dir As String
        For Each dir In dirs
            CopyDirectory(dir, destDirName + System.IO.Path.GetFileName(dir))
        Next
    End Sub

End Module



''' <summary>
''' 引数内のコマンド解析
''' </summary>
''' <remarks></remarks>
Public Class CommandParser

    ''' <summary>
    ''' コマンドを解析する
    '''
    ''' 例. "-a bbb ccc -D eee"
    ''' このような引数を受け取ったとき下記のDictionaryに変換する
    ''' a,[bbb,ccc]
    ''' d,[eee]
    ''' </summary>
    ''' <param name="args">引数</param>
    ''' <returns>
    ''' コマンド名と値が対応したDictionaryを返す
    ''' ※コマンド名は小文字に変換される
    ''' ※解析できなかった場合も空のDictionaryを返す
    ''' </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 'そのコマンドの引数

        '1つずつ解析
        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.ToLower
                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
最終更新:2016年06月21日 00:36