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