很多情況下需要支持命令行運行,但是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