[CONSOLE] Wenn etwas bestimmtes eingegeben wurde dann etwas bestimmtes machen

  • VB.NET

Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    So funktioniert es jetzt:

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports System.Windows.Forms
    3. Module kit_shell
    4. Sub Main()
    5. 'declaration for folder browser
    6. Dim folderBrowser As New FolderBrowserDialog
    7. 'ends declaration
    8. Console.ForegroundColor = ConsoleColor.White
    9. 'kit-shell constructor
    10. Console.Title = "Kit Shell - #kit app /init"
    11. Console.Title = "Kit Shell - MSWINDIR32~"
    12. 'constructor ends
    13. 'base console text
    14. Console.WriteLine("Welcome to Kit Shell (version 1.0)" & vbCrLf & vbCrLf & "Run '#kit help' to display the help index." & vbCrLf & "Run '#kit doc' to visit the documentation on GitHub." & vbCrLf)
    15. 'ends the base console text
    16. 'start console input
    17. Console.ForegroundColor = ConsoleColor.Green
    18. Dim input As String = Console.ReadLine()
    19. If input = "text" Then
    20. MsgBox("l")
    21. End If
    22. End Sub
    23. End Module
    @iEi:: Das ist der WorkFlow einer Console.
    Wenn Du nicht willst, dass Dein Programm beendet wird, musst Du eine Schleife mit einer sinnvollen Abbruchbedingung proggen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jedes Programm beendet sich wenn es die Mainfunktion verlässt. Bei GUI Anwendungen läuft kontinuierlich die Messagequeue fürs Fenster und somit kann die Funktion nicht returnen bis diese Schleife zuende läuft. Wenn deine Mainfunktion der Konsole jetzt endet, endet auch das Programm.
    @Gonger96

    Das will ich halt verhindern wenn ich jz so mache:

    VB.NET-Quellcode

    1. If input.StartsWith("text") Then
    2. MsgBox("l")
    3. Console.ReadLine()
    4. End If
    5. If input.StartsWith("text1") Then
    6. MsgBox("l")
    7. Console.ReadLine()
    8. End If

    Und ich nach text text1 eingebe beendet sich des Programm und das will ich halt verhindern

    iEi schrieb:

    und das will ich halt verhindern
    So:

    RodFromGermany schrieb:

    Wenn Du nicht willst, dass Dein Programm beendet wird, musst Du eine Schleife mit einer sinnvollen Abbruchbedingung proggen.
    Das ist eine Schleife:

    VB.NET-Quellcode

    1. Do
    2. Console.ReadLine()
    3. ' ...
    4. Loop
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    thefiloe schrieb:

    b) was soll das eigentlich alles werden? das ist alles komplett statisch. wenn du mehr als 5 befehle hast dann ist das nen scheiß konzept und ich würde mir erstmal nen objekt modell überlegen. auch wenn du dich dagegen komplett sträubst(kennen wir ja alle schon zur genüge).

    Wie immer komplett ignoriert und brainfuck hingeclustert. Sehr gut. Wieso nimmst du nie einen Rat an fängst an MIT OOP! Langsam habe ich das Gefühl, dass man mit dir die Evolutionstheorie wiederlegen könnte. Du steigst einfach auf absolut rein gaaar nichts neues oder auch nur im Ansatz Fortgeschrittenes ein. Nein lieber clusterst du 100 Abfragen mit gleichem Inhalt hin. Alles zu 100% statisch und vom Code her einfach nur unfassbar hässlich.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hi

    VB.NET-Quellcode

    1. Do
    2. Dim input() As String = Console.ReadLine().Split(" "c)
    3. Select Case input(0)
    4. Case "a"
    5. 'mach was für Kommando a
    6. Case "b"
    7. Case "c"
    8. Case "exit"
    9. Exit Do
    10. Case Else
    11. Console.WriteLine("Unknown command.")
    12. End Select
    13. Loop

    Oder eben mit Dictionary(Of String, Command), Command ist eine abstrakte Klasse oder ein Delegat.

    VB.NET-Quellcode

    1. Public MustInherit Class Command
    2. Private _name As String
    3. Public MustOverride Sub Print(output As IOutputProvider)
    4. Public ReadOnly Property Name As String
    5. Get
    6. Return _name
    7. End Get
    8. End Property
    9. Public Sub New(name As String)
    10. If name Is Nothing Then Throw New ArgumentNullException("name")
    11. If name.Any(AddressOf Char.IsWhitespace) Then
    12. Throw New ArgumentException("Whitespaces in command names are not allowed.")
    13. End If
    14. _name = name
    15. End Class

    Name ist dann der Begriff, der zum Zuordnen des Commands verwendet wird. Diesen haust du entsprechend in ein Dictionary. IOutputProvider ist bspw. eine Console, an die du ein Objekt schreiben kannst. Diese modellierst du bspw. als Interface und stellst darin die Funktionalität bereit:

    VB.NET-Quellcode

    1. Public Interface IOutputProvider
    2. Sub Print(value As Object)
    3. Sub Close()
    4. End Interface
    5. Public Class ConsoleOutputProvider
    6. Implements IOutputProvider
    7. Private _closed As Boolean
    8. Public Overridable Sub Print(value As Object) Implements IOutputProvider.Print
    9. If Closed Then Throw New InvalidOperationException("Output has been closed.")
    10. Console.WriteLine(value)
    11. End Sub
    12. Public Overridable Sub Close() Implements IOutputProvider.Close
    13. _closed = True
    14. End Sub
    15. Public ReadOnly Property Closed As Boolean
    16. Get
    17. Return _closed
    18. End Get
    19. End Property
    20. End Class

    so, schön overengineered, aber mit voneinander losgelösten Schichten und dynamischer Ergänzbarkeit. Statt dem Dictionary kann man auch eine KeyedCollection verwenden, die wäre sogar noch besser, als das Dictionary selbst, weil die Schlüssel automatisch verwendet werden. Dabei muss man allerdings Vererbung benutzen. Ich habe es jetzt bewusst nicht ausgeweitet, damit du selbst lernst, wie du lernst.

    Gruß
    ~blaze~
    @~blaze~:
    Das ist auch ein sehr interessanter Ansatz :thumbup: .

    @thefiloe:

    Ich bin zwar grundsätzlich deiner Meinung, das man Leute auf ihre Lernresistenz hinweißt allerdings könntest du deinen Ton mäßigen. Und ja ich weiß auch wie nervig es sein kann es jemandem x mal zu erklären und er es ignoriert oder einfach nicht daraus lernt. Generell wenn sowas passiert könnten alle User hier mal etwas ruhiger bleiben, denn wir befinden uns hier nicht auf irgendso einem 3 klassigen Internetportal auf dem die ganze Zeit nur Flüche und Beleidigungen ausgetauscht werden.

    8-) faxe1008 8-)
    @~blaze~

    So nun hier soweit bin ich jetzt :)

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports System.Windows.Forms
    3. Imports Ionic.Zip
    4. Module kit_shell
    5. Sub Main()
    6. 'declaration for folder browser
    7. Dim folderBrowser As New FolderBrowserDialog
    8. 'ends declaration
    9. Console.ForegroundColor = ConsoleColor.White
    10. 'kit-shell constructor
    11. Console.Title = "Kit Shell - #kit app /init"
    12. Console.Title = "Kit Shell - MSWINDIR32~"
    13. 'constructor ends
    14. 'base console text
    15. Console.WriteLine("Welcome to Kit Shell (version 1.0)" & vbCrLf & vbCrLf & "Run '#kit help' to display the help index." & vbCrLf & "Run '#kit doc' to visit the documentation on GitHub." & vbCrLf)
    16. 'ends the base console text
    17. 'start console input
    18. Console.ForegroundColor = ConsoleColor.Green
    19. Do
    20. Dim input() As String = Console.ReadLine().Split(">"c)
    21. Select Case input(0)
    22. Case "#kit help"
    23. Process.Start(Application.StartupPath & "\kit_help_index.txt")
    24. Case "#kit path /s"
    25. If folderBrowser.ShowDialog = DialogResult.OK Then
    26. Console.Title = folderBrowser.SelectedPath
    27. Console.ForegroundColor = ConsoleColor.Magenta
    28. Console.WriteLine("Selected path:" & folderBrowser.SelectedPath)
    29. Console.ForegroundColor = ConsoleColor.Green
    30. End If
    31. Case "#kit init"
    32. Try
    33. Console.ForegroundColor = ConsoleColor.Yellow
    34. Console.WriteLine("Starting Zipping...0%")
    35. Dim zipFile As New ZipFile()
    36. Console.WriteLine("Zipping...10%")
    37. zipFile.AddDirectory(Console.Title)
    38. Console.WriteLine("Add Directory...50%")
    39. zipFile.Save(Console.Title & "\binaries.zip")
    40. Console.WriteLine("Finished!...100%")
    41. Console.WriteLine("Zipping was succesfully Output are here: " & Console.Title & "\binaries.zip")
    42. Console.ForegroundColor = ConsoleColor.White
    43. Catch
    44. Console.ForegroundColor = ConsoleColor.Red
    45. Console.WriteLine("Invalid Path ! MSWINDIR32~ or a # command is not a valid path, please input '#kit path /s' and select a valid path.")
    46. Console.ForegroundColor = ConsoleColor.Green
    47. End Try
    48. Case Else
    49. Console.ForegroundColor = ConsoleColor.Red
    50. Console.WriteLine("Unknown command.Please input '#kit help' to see a list with commands.")
    51. Console.ForegroundColor = ConsoleColor.Green
    52. End Select
    53. Loop
    54. End Sub
    55. End Module


    @thefiloe

    Es sind mehr als 5 Befehle, ich weiss du kannst mich nicht besonders gut leiden,aber musst du dann so zu mir sein ? Ich bin 14,ich weiss leider auch nocht nicht alles.Die Abfragen waren erst alle gleich um es zu testen ob es überhaupt so geht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „iEi“ ()

    Wozu genau ist das Try-Catch? Und warum schluckst du alle Fehler? Fehler sind hilfreich, nicht feindlich. Ich finde ja diesen Statusreport auch etwas ulkig, sorry. Die Prozente geben dem Benutzer ungefähr gar keine Info über den tatsächlichen Fortschritt. Außerdem haben wir die bereits in mehreren Beiträgen verdeutlicht, dass zur Pfadverknüpfung System.IO.Path.Combine zu verwenden ist, nicht der &-Operator. Console.Title ist auch irgendwie etwas seltsam, als Bezeichner, der Ordner ist wohl auch etwas seltsam gewählt.
    Statt jede Kombination manuell abzufragen, wäre es geschickter, die Parameter direkt auszulesen und zu übergeben. Ggf. findet da jemand anderes Lust, das zu erklären und in meine obige Architektur (die ich eigentlich sehen wollte) zu integrieren, ich habe gerade keine Zeit. ;) Behalte das übrigens immer alles im Kopf und lerne für zukünftige Programme. Wie schon mehrfach betont ist das Alter keine Ausrede. Ich habe mit 14 auch nichts gewusst - noch nicht mal programmiert - aber als ich darauf gestoßen bin, habe ich sehr schnell gelernt und das solltest du auch können.
    Btw. bin auch erst 22 und heul auch nicht wegen meinem Alter rum. ;P

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Dass du 14 bist ist keine Ausrede. Und anders hörst du auf niemanden. Man hat dir bereits zig mal immer und immer wieder das Selbe gesagt. Keiner beschwert sich wenn jemand noch nicht alles kann oder von mir aus auch gar nichts kann. Jeder fängt mal an. Doch wenn man jedes mal immer und immer wieder das Selbe sagt und jemand der offen gesagt nicht annähernd Grundlagenwissen besitzt sicher dauernd darüber hinweg setzt, glaubt es besser zu wissen und anschließend wieder mit den selben Problemen ankommt, dann ist das sehr wohl Grund sich etwas darüber zu ärgern.
    Und sorry. Aber dieses Konzept fliegt dir innerhalb von kürzester Zeit um die Ohren. Sobald du zwei Optionen anbietest, kannst du den Code immer doppelt und dreifach kopieren. Außerdem ist es in keinster Weise erweiterbar und soviel ich sehe ignorierst du nicht mal Groß- und Kleinschreibung(was in so einem Fall vll. nicht wirklich schlecht wäre).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    iEi schrieb:

    Es sind mehr als 5 Befehle
    Dann gewöhn Dir gleich einen ordentlichen Stil an und pack jeden Befehl in eine separate Prozedur.
    Und wenn es sein muss, sogar in eine separate Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Meins sähe übrigens in einfacher Form so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Friend Class Program
    3. Public Shared Sub Main(args() As String)
    4. Dim parts As IEnumerable(Of String) = args 'Input (Kommandozeilenparameter) auswerten
    5. 'Liste der Kommandos
    6. Dim commands As New CommandList()
    7. 'Ausgabe für Konsolen
    8. Dim consoleOutput As New ConsoleIOProvider()
    9. 'Kommandos, die unterstützt werden und deren Funktionalität in Form eines Delegaten
    10. commands.Add(Command.FromDelegate("help", Sub(argv, outp)
    11. outp.Print("Supported commands:")
    12. For Each cmd As Command In commands
    13. outp.Print(cmd.Name)
    14. Next
    15. End Sub))
    16. commands.Add(Command.FromDelegate("echo", Sub(argv, outp)
    17. 'Argumente ausgeben
    18. outp.Print(String.Join(" ", argv))
    19. End Sub))
    20. commands.Add(Command.FromDelegate("echolines", Sub(argv, outp)
    21. Dim cv As Integer
    22. Dim c As String = Nothing
    23. Dim cp As IDictionary(Of String, String) = GetArguments(argv)
    24. If cp Is Nothing Then
    25. consoleOutput.PrintError("Bad command line format.", False)
    26. ElseIf cp.Count = 0 OrElse Not cp.TryGetValue("-c", c) Then
    27. outp.PrintError("Missing needed parameter 'c'. Command was not executed.", True)
    28. ElseIf Not Integer.TryParse(c, cv) Then
    29. outp.PrintError("Invalid input format for parameter 'c'. Command was not executed.", True)
    30. End If
    31. 'Argumente einlesen und mit ", " aneinander reihen
    32. Dim outpargs As New List(Of String)()
    33. For i As Integer = 1 To cv
    34. outpargs.Add(outp.ReadBlock())
    35. Next
    36. outp.Print(String.Join(", ", outpargs))
    37. End Sub))
    38. commands.Add(Command.FromDelegate("exit", Sub(argv, outp)
    39. 'Keine weiteren Eingaben mehr zulassen
    40. outp.Close()
    41. End Sub))
    42. 'Verarbeitungsvorgang
    43. Do
    44. 'Kommando aus Eingabe ermitteln oder Nothing, wenn keines vorhanden ist
    45. Dim cmdstr As String = parts.FirstOrDefault()
    46. If cmdstr IsNot Nothing Then 'wenn eines vorhanden ist
    47. Dim cp As Command
    48. 'Kommando ermitteln
    49. Try
    50. cp = commands(cmdstr)
    51. Catch ex As KeyNotFoundException
    52. cp = Nothing
    53. End Try
    54. If cp Is Nothing Then 'wenn kein Kommando existiert wird der Benutzer informiert
    55. consoleOutput.PrintError("Command '" + cmdstr + "' not found.", False)
    56. Else
    57. 'sonst wird es ausgeführt (hier könnte man als ersten Parameter auch den Namen lassen, der wird hier weggelassen)
    58. cp.Process(parts.Skip(1), consoleOutput)
    59. End If
    60. End If
    61. If consoleOutput.Closed Then 'Wenn IO geschlossen wurde (==> exit-Kommando) abschließen
    62. Exit Do
    63. End If
    64. 'neue Benutzereingabe parsen
    65. Do
    66. Console.Write("> ")
    67. parts = ProcessInput(Console.ReadLine())
    68. If parts Is Nothing Then
    69. consoleOutput.PrintError("Bad command line format.", False)
    70. End If
    71. Loop While parts Is Nothing
    72. Loop
    73. End Sub
    74. Private Shared Function ProcessInput(input As String) As IEnumerable(Of String)
    75. Dim args As New List(Of String)()
    76. Dim i As Integer = 0
    77. Dim marker As Integer = 0
    78. While i < input.Length
    79. Dim c As Char = input(i)
    80. '"<daten>" auslesen
    81. If c = """"c Then
    82. i += 1
    83. marker = i
    84. i = input.IndexOf(""""c, i)
    85. If i = -1 Then Return Nothing
    86. If marker <> i Then args.Add(input.Substring(marker, i - marker))
    87. i += 1
    88. marker = i
    89. Else 'sonstige am Leerzeichen trennen
    90. If Char.IsWhiteSpace(c) Then
    91. If marker <> i Then args.Add(input.Substring(marker, i - marker))
    92. marker = i + 1
    93. End If
    94. i += 1
    95. End If
    96. End While
    97. If marker <> i Then
    98. args.Add(input.Substring(marker, i - marker))
    99. End If
    100. Return args
    101. End Function
    102. Private Shared Function GetArguments(input As IEnumerable(Of String)) As IDictionary(Of String, String)
    103. 'paarweise auslesen und in ein Dictionary stopfen, man könnte auch schönere Angaben machen
    104. '(z.B. Argumente mit - beginnen lassen und den Rest als Argumentwerte ansehen)
    105. '-c 5 als Eingabe z.B. würde zu einem Dictionary-Eintrag {"-c", "5"} führen
    106. Using enr As IEnumerator(Of String) = input.GetEnumerator()
    107. Dim ccommand As String
    108. Dim dtc As New Dictionary(Of String, String)()
    109. While enr.MoveNext()
    110. ccommand = enr.Current
    111. If enr.MoveNext() Then
    112. dtc.Add(ccommand, enr.Current)
    113. Else
    114. Return Nothing
    115. End If
    116. End While
    117. Return dtc
    118. End Using
    119. End Function
    120. End Class
    121. Public Class CommandList
    122. Inherits KeyedCollection(Of String, Command)
    123. Protected Overrides Function GetKeyForItem(item As Command) As String
    124. Return item.Name
    125. End Function
    126. Public Sub New()
    127. Me.New(False)
    128. End Sub
    129. Public Sub New(ignoreCase As Boolean)
    130. MyBase.New(If(ignoreCase, StringComparer.OrdinalIgnoreCase, StringComparer.Ordinal))
    131. End Sub
    132. End Class
    133. Public Interface IIOProvider
    134. Sub Print(value As Object)
    135. Sub PrintError(details As Object, asWarning As Boolean)
    136. Function ReadBlock() As String
    137. Sub Close()
    138. End Interface
    139. Public MustInherit Class Command
    140. Private _name As String
    141. Public Sub New(name As String)
    142. If name Is Nothing Then Throw New ArgumentNullException("name")
    143. If name.Any(AddressOf Char.IsWhiteSpace) Then Throw New ArgumentException("Name mustnot contain any whitespace characters.")
    144. _name = name
    145. End Sub
    146. Public ReadOnly Property Name As String
    147. Get
    148. Return _name
    149. End Get
    150. End Property
    151. 'Führt das Kommando aus, args enthält die angegebenen Parameter
    152. Public MustOverride Sub Process(args As IEnumerable(Of String), output As IIOProvider)
    153. Public Shared Function FromDelegate(name As String, handler As Action(Of IEnumerable(Of String), IIOProvider)) As Command
    154. If handler Is Nothing Then Throw New ArgumentNullException("handler")
    155. Return New DelegateCommand(name, handler)
    156. End Function
    157. Public Shared Function FromDelegate(name As String, handler As Func(Of IEnumerable(Of String), IIOProvider, Object)) As Command
    158. If handler Is Nothing Then Throw New ArgumentNullException("handler")
    159. Return New DelegateCommand(name, Sub(args, outputProvider)
    160. Dim val As Object
    161. Dim failed As Boolean = False
    162. Try
    163. val = handler(args, outputProvider)
    164. Catch ex As Exception
    165. val = ex
    166. failed = True
    167. End Try
    168. If failed Then
    169. outputProvider.PrintError(val, TypeOf val Is System.ComponentModel.WarningException)
    170. Else
    171. outputProvider.Print(val)
    172. End If
    173. End Sub)
    174. End Function
    175. Private Class DelegateCommand
    176. Inherits Command
    177. Private _handler As Action(Of IEnumerable(Of String), IIOProvider)
    178. Public Sub New(name As String, handler As Action(Of IEnumerable(Of String), IIOProvider))
    179. MyBase.New(name)
    180. If handler Is Nothing Then Throw New ArgumentNullException("handler")
    181. _handler = handler
    182. End Sub
    183. Public Overrides Sub Process(args As IEnumerable(Of String), output As IIOProvider)
    184. _handler(args, output)
    185. End Sub
    186. End Class
    187. End Class
    188. Public Class ConsoleIOProvider
    189. Implements IIOProvider
    190. Private _closed As Boolean
    191. Public ReadOnly Property Closed As Boolean
    192. Get
    193. Return _closed
    194. End Get
    195. End Property
    196. Public Sub Close() Implements IIOProvider.Close
    197. _closed = True
    198. End Sub
    199. Public Sub Print(value As Object) Implements IIOProvider.Print
    200. 'Ursprüngliche Farbe speichern, neue setzen, anschließend wieder zurücksetzen
    201. Dim c As ConsoleColor = Console.ForegroundColor
    202. Console.ForegroundColor = ConsoleColor.White
    203. PrintCore(value)
    204. Console.ForegroundColor = c
    205. End Sub
    206. Public Sub PrintError(details As Object, asWarning As Boolean) Implements IIOProvider.PrintError
    207. Dim c As ConsoleColor = Console.ForegroundColor
    208. Console.ForegroundColor = If(asWarning, ConsoleColor.Yellow, ConsoleColor.Red)
    209. PrintCore(details)
    210. Console.ForegroundColor = c
    211. End Sub
    212. Private Sub PrintCore(value As Object)
    213. Console.WriteLine(value)
    214. End Sub
    215. Public Function ReadBlock() As String Implements IIOProvider.ReadBlock
    216. Return Console.ReadLine()
    217. End Function
    218. End Class


    Gruß
    ~blaze~