VB.net程序處理命令行參數的例子

很多情況下需要支持命令行運行,但是VB中的主函數並沒有直接支持命令行參數,獲取方法有些特別。

今天用vb.net做了個,記錄在這裏以備日後查找。VB的處理與此不同,網上查了下,需要使用系統DLL文件中的GetCommandLine函數。

這裏這個程序的命令行參數處理並不是很好,並不完善。命令行參數的處理還是比較複雜的。這裏主要是看如何獲取VB.net程序的命令行參數。

如有高人精通命令行的處理,有什麼好思路也請在這裏指點下。^_^

Imports System.IO

Module Module1
    Public AppVersion As String = "1.0"

    Private CommandParameters() As String
    Private isIllogreCase As Boolean = False
    Private isSearchSubDir As Boolean = False
    Private logFileName As String = "log.txt"
    Private fileFilter As String = "*.*"
    Private filePath As String = "./"
    Private LogWriter As TextWriter = Console.Out
    Private patternString As String

    Sub Main()
        If Not IsValidCommandLine() Then
            Exit Sub
        End If

        LogWriter.WriteLine("[" & DateTime.Now & "]Start.")
        StartFind()
        LogWriter.WriteLine("[" & DateTime.Now & "]end.")
        CloseLogWriter()
    End Sub

    Sub PrintUsage()
        Console.WriteLine("FindStringInFiles Version : " & AppVersion)
        Console.WriteLine("功能: 在符合條件的文件中查找指定的字符串。")
        Console.WriteLine("用法:")
        Console.WriteLine("FindStringInFiles ""PatternString""" & _
                          "[-I] [-log [filename]] [-P [drive:]path] -S [-f filter]")
        Console.WriteLine("    PatternString    查找的目標字符串,支持正則表達式。")
        Console.WriteLine("    -I               在查找時忽略大小寫,不指明則匹配大小寫。")
        Console.WriteLine("    -log [filename]  將結果保存在日誌文件中,不給出文件名是默認保存在當前目錄的log.txt中。")
        Console.WriteLine("                     不給出-log則輸出結果到標準輸出。")
        Console.WriteLine("    -P [drive:]path  指定起始路徑,不指定則從當前目錄開始搜索。")
        Console.WriteLine("    -S               是否搜索子目錄,默認不搜索子目錄。")
        Console.WriteLine("    -f filter        文件過濾條件,例如-f ’config_*.txt‘")
    End Sub

    Function IsValidCommandLine() As Boolean
        CommandParameters = My.Application.CommandLineArgs.ToArray
        If CommandParameters.Length = 0 Then
            PrintUsage()
            Return False
        End If

        InitLogWriter()
        LogWriter.WriteLine("FindStringInFiles Version : " & AppVersion)
        LogWriter.WriteLine("[" & DateTime.Now & "]CommandLine parameters : " & _
                            Microsoft.VisualBasic.Interaction.Command)

        patternString = CommandParameters(0)

        If Not SetPattern() Then
            Return False
        End If

        If Not SetFilePath() Then
            Return False
        End If
        IsSearchSubdirectory()

        If Not SetFileFilter() Then
            Return False
        End If

        Return True
    End Function

    Function SetPattern()
        For Each p In CommandParameters
            If 0 = String.Compare(p, "-I") Then
                isIllogreCase = True
                Exit For
            Else
                isIllogreCase = False
            End If
        Next
        Return True
    End Function

    Function SetFilePath() As Boolean
        Dim index As Integer = 0
        Dim paremCount As Integer = CommandParameters.Length

        While index < paremCount
            If 0 = String.Compare(CommandParameters(index), "-P") Then
                ' 最後一個參數是 -P 沒有參數值
                If index = paremCount - 1 Then
                    LogWriter.WriteLine("Miss value for operation '-P'!")
                    Return False
                Else ' 否則-P的下一個參數就是值
                    filePath = CommandParameters(index + 1)
                    Return True
                End If
            End If
            index += 1
        End While

        If index >= paremCount Then
            fileFilter = "*.*"
        End If

        Return True
    End Function

    Sub IsSearchSubdirectory()
        For Each p In CommandParameters
            If 0 = String.Compare(p, "-S") Then
                isSearchSubDir = True
                Exit For
            Else
                isSearchSubDir = False
            End If
        Next
    End Sub

    Function SetFileFilter() As Boolean
        Dim index As Integer = 0
        Dim paremCount As Integer = CommandParameters.Length

        While index < paremCount
            If 0 = String.Compare(CommandParameters(index), "-f") Then
                ' 最後一個參數是 -f 沒有參數值
                If index = paremCount - 1 Then
                    LogWriter.WriteLine("Miss value for operation '-f'!")
                    Return False
                Else ' 否則-f的下一個參數就是值
                    fileFilter = CommandParameters(index + 1)
                    Return True
                End If
            End If
            index += 1
        End While

        If index >= paremCount Then
            fileFilter = "*.*"
        End If

        Return True
    End Function

    Sub InitLogWriter()
        Dim index As Integer = 0
        Dim paremCount As Integer = CommandParameters.Length

        While index < paremCount
            If 0 = String.Compare(CommandParameters(index), "-log") Then
                ' 參數 -log 後面帶有文件名
                If index < paremCount - 1 Then
                    logFileName = CommandParameters(index + 1)
                End If
                Exit While
            End If
            index += 1
        End While
        ' 沒有指定 -log 選項
        If index > paremCount Then
            Return
        End If

        If File.Exists(logFileName) Then
            File.Delete(logFileName)
        End If
        'Create the log file.
        Dim sw As StreamWriter = New StreamWriter(logFileName)
        LogWriter = sw
    End Sub

    Sub CloseLogWriter()
        LogWriter.Close()
    End Sub

    Sub StartFind()
        LogWriter.WriteLine("找啊,找啊,找到一個在這裏~")
        LogWriter.WriteLine("敬個禮啊,握握手。把你放在日誌裏~")
        LogWriter.WriteLine("哇喔,終於找完了 ^_^")
    End Sub

End Module


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章